【问题标题】:Python 3: Tkinter: How to change Entry.get() into an integerPython 3:Tkinter:如何将 Entry.get() 更改为整数
【发布时间】:2017-09-04 12:16:28
【问题描述】:

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

我最近才开始重新编码,所以答案可能很简单,我错过了,但感谢任何答案。

【问题讨论】:

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

标签: python tkinter integer tkinter-entry


【解决方案1】:

问题和错误说明是空字符串'' 无法转换为整数。

其实很多字符串是不能转成整数的。 在您的情况下,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()

【讨论】:

  • 当我在您的回答的帮助下更改我的代码时,它仍然不起作用并且我收到相同的错误消息,但是当值不是整数时它确实打印 none。错误指向这一行:conversion=int(e.get())。我怎样才能解决这个问题?谢谢
  • 你需要摆脱这个int(e.get())。它应该替换为get_value(e)。问题是直接转换为int 会引发错误,不会被捕获。像我在函数中那样包装这个转换将允许捕获错误。
  • @BillR 请检查我的编辑。我给了你一个有效的代码。我希望这将帮助您掌握 GUI 的基础知识。
【解决方案2】:

试试这个代码:

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

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多