Python 3:tkinter:如何将entry.get()更改为整数



我正在编码一个简单的程序,该程序将 Imperial单位转换为公制单位。但是,当我使用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()

我直到最近才再次开始编码,所以答案可能是我错过的真正简单的东西,但是感谢您的任何答案。

问题,以及错误指出的是,空字符串''不能转换为整数。

实际上,许多字符串无法转换为整数。在您的情况下,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()

但是,这有点尴尬。由于条目的内容在主循环之前被捕获,因此后者始终为空。

在与GUIS打交道时,您无法像往常一样顺序思考。您宁愿要求按下按下时更新标签的内容,以使其显示转换的结果:

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

尝试以下代码:

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

相关内容

  • 没有找到相关文章

最新更新