【问题标题】:int() can't convert non-string with explicit base when converting to GUI转换为 GUI 时 int() 无法转换具有显式基数的非字符串
【发布时间】:2018-03-02 15:39:46
【问题描述】:

我正在运行一个基本的 hex2dec 转换器,并希望将其从控制台转换为 GUI。

现在程序在控制台中运行良好,但是在我转换为 GUI 之后,它似乎抛出了 int() can't convert non-string with explicit base 错误。

这是图形用户界面代码

from tkinter import *

root = Tk()
root.geometry("400x400+250+250")
root.title("Hex Converter")

heading = Label(root, text="Simple Hex to Decimal Converter", font=('arial 15 bold'), fg="steelblue").pack()

entr_hex_val = Label(root, text="Enter Hex Value to Convert", font=('arial 13 bold')).place(x=10, y=50)

my_num = IntVar()
ent_box = Entry(root, width=50, textvariable=my_num).place(x=10, y=90)

def converter():
    hexdec = my_num.get()
    dec = int(hexdec, 16)
    lab = Label(root, text=("decimal value = "+ str(dec)), font=('arial 25 bold'), fg="red").place(x=10, y=200)

conv = Button(root, text="Convert", width=12, height=2, bg="lightgreen", command=converter).place(x=10, y=130)

root.mainloop()

和控制台代码

import os

def hexconverter:
    os.system('cls')
    hexdec = input("Enter number in Hexadecimal Format: ")
    dec = int(hexdec, 16)
    print(str(dec))

hexconverter()

我很难理解为什么相同的代码在控制台中有效,但在 GUI 中无效。

【问题讨论】:

  • my_num = IntVar(): 这可能意味着my_num.get() 返回一个int,而不是一个字符串。
  • 谢谢,我一定是瞎了眼,把它改成 StringVar 解决了这个问题,我不得不从 + str(dec)) 中删除 str,现在工作正常。从美学的角度来看,唯一的问题是标签末尾显示的值显示为 {Decimal value = } 只是在徘徊为什么花括号在那里。但感谢您的快速响应
  • @DavidM 这个给定的代码不应该有任何花括号。也许您尝试了一些字符串格式并在周围放置了额外的花括号?

标签: python python-3.x tkinter


【解决方案1】:

当您在 IntVar 上使用 .get() 时,它会返回一个整数和 int 转换,并按照错误消息中的说明对字符串进行指定的基础工作。

您可以在使用前将值转换为字符串。

dec = int(str(hexdec), 16)

但由于您使用的是十六进制值,您的输入可能会得到字符 AF 和 IntVar 如果在使用 .get() 时看到任何非整数值,则会引发错误,因此您使用 StringVar 会更容易并使用try-except 捕获转换错误。

另外一点是,您的代码将在每次点击时重新创建标签,lab 将始终具有值 None。重新创建可能会导致一些内存问题(好吧,也许不在这个小问题中,但仍然值得注意)。您可以在全局范围内创建一次,然后在需要时更改其值,而不是每次都创建标签。

my_num = StringVar()  

lab = Label(root, text="", font='arial 25 bold', fg="red")
lab.place(x=10, y=200) #also notice seperated the place line to avoid NoneType error

def converter():
    hexdec = my_num.get()
    try:
        dec = int(hexdec, 16)
        lab["text"] = "decimal value = "+ str(dec)
    except ValueError:
        lab["text"] = "Error, please enter valid hex value"

【讨论】:

    【解决方案2】:

    十六进制数必须是字符串,并且您将my_num 定义为整数。将my_num = IntVar() 更改为my_num = StringVar() 应该可以解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2012-10-20
      • 2020-08-10
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多