我正在编写一个简单的程序,它将英制单位转换为公制单位。但是,当我使用Entry.get()
命令时,我需要将其转换为整数,当我尝试这样做时
我收到此错误:
Traceback (most recent call last):
File "C:/Users/Bill/converter.py", line 18, in <module>
conversion=int(e.get())
ValueError: invalid literal for int() with base 10: ''
我尝试运行我正在做的非常基本的版本(如下所示),但仍然会导致同样的错误。
import tkinter
root= tkinter.Tk()
e=tkinter.Entry(root)
e.pack()
b=tkinter.Button(root, command= lambda: print(e.get()))
b.pack()
conversion=int(e.get())
conversion= conversion* 1.8 +32
l = tkinter.Label(root, text=conversion)
top.mainloop()
我最近才重新开始编码,所以答案很可能是我错过了一些非常简单的事情,但感谢您的回答。
答案 0 :(得分:3)
问题以及错误说明的是,空字符串''
无法转换为整数。
实际上,很多字符串都无法转换为整数。
在您的情况下,int(e.get())
会引发错误,因为该条目为空,但int('')
会引发错误。
因此,您需要在转换之前验证输入,以便仅在包含整数的字符串表示时才处理它。
您可以将try
- except
打包到get_value
函数中:
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
然后,不要将lambda: print(e.get())
设置为按钮的回调,而是传递lambda: print(get_value(e))
。
如果值可以解析为整数,则会打印int(e.get())
的结果。
如果不能,则会打印None
。
以下是您的代码的修改版本:
import tkinter
root= tkinter.Tk()
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
e = tkinter.Entry(root)
e.pack()
b = tkinter.Button(root, command=lambda: print(e.get()))
b.pack()
conversion = get_value(e)
if conversion is not None:
conversion *= 1.8 + 32
l = tkinter.Label(root, text=conversion)
top.mainloop()
然而,这有点尴尬。
由于条目的内容在主循环之前被捕获,后者将始终为空。
在处理GUI时,你不能像通常那样顺序思考。 您应该在按下时让按钮更新标签内容,以便显示转换结果:
import tkinter
def get_value(entryWidget):
value = entryWidget.get()
try:
return int(value)
except ValueError:
return None
def convert(value):
if value is None:
return None
else:
return 1.8*value + 32
def set_label_text(label, entry):
value = convert(get_value(entry))
if value is None:
label['text'] = "Enter an integer"
else:
label['text'] = value
root = tkinter.Tk()
e = tkinter.Entry(root)
l = tkinter.Label(root, text="")
b = tkinter.Button(root, text="Convert", command=lambda: set_label_text(l, e))
e.pack()
l.pack()
b.pack()
root.mainloop()
答案 1 :(得分:0)
试试这段代码:
import sys
if sys.version_info.major < 3: # for Python 2.x
import Tkinter as tk
else: # for Python 3.x
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.master.title("Conversion application")
self.master.geometry("300x100")
self.x = tk.IntVar()
self.grid()
self.createWidgets()
def createWidgets(self):
self.e = tk.Entry(self, textvariable=self.x)
self.e.bind('<Return>', self.convert)
self.e.focus()
self.e.grid()
self.b = tk.Button(self, text="Convert", command=self.convert)
self.b.grid()
self.l = tk.Label(self)
self.l.grid()
def convert(self, event=None):
try:
print(self.x.get())
conversion = self.x.get()
conversion = conversion * 1.8 + 32
self.l.config(text=conversion)
except tk.TclError:
self.l.config(text="Not an integer")
app = Application()
app.mainloop()