2017-09-04 444 views
2

我正在编写一个简单的程序,将英制单位转换为公制单位。然而,当我使用Entry.get()命令,我需要将其转换为整数,当我尝试这样做,Python 3:Tkinter:如何将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

要调用' e.get()创建小部件后一毫秒。用户没有时间输入任何数据。 –

回答

2

问题及错误状态是空字符串''无法转换为整数。

实际上,很多字符串不能转换为整数。 在你的情况下,int(e.get())产生一个错误,因为该项是空的,但int('')产生了一个错误。 因此,您需要在转换它之前验证输入,以便仅在包含整数的字符串表示形式时才对其进行处理。

def get_value(entryWidget): 
    value = entryWidget.get() 
    try: 
     return int(value) 
    except ValueError: 
     return None 

然后,而不是设置lambda: print(e.get())作为回调到您的按钮,通过lambda: print(get_value(e)):在get_value功能except -

你可以用一个try。 如果该值可能被解析为一个整数,这将打印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() 

然而,这是一个有点尴尬。 由于条目的内容在主循环之前被捕获,所以后者将始终为空。

在处理图形用户界面时,您无法像往常一样按顺序思考。 你应该先问一下你的按钮更新标签的内容按下时,以使其显示转换的结果是:

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() 
+0

当我用你的答案帮助改变我的代码时,它仍然不起作用,并且我得到相同的错误消息,但是当值不是整数时它不打印任何东西。错误指向这一行:'conversion = int(e.get())'。我怎样才能解决这个问题?谢谢 –

+0

你需要摆脱这个'int(e.get())'。它应该由'get_value(e)'代替。问题是直接转换为'int'会产生一个错误,不会被捕获。包装这个转换,就像我在一个函数中做的一样,可以捕捉错误。 –

+0

@BillR请检查我的编辑。我给你一个正在工作的代码。我希望这能帮助你掌握GUI的基础知识。 –

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()