Python 一个我似乎无法摆脱的tkinter程序错误
我使用tkinter时出错,我无法理解我的错误操作导致了此错误 这是我的代码:Python 一个我似乎无法摆脱的tkinter程序错误,python,python-3.x,tkinter,tkinter-entry,tkinter-layout,Python,Python 3.x,Tkinter,Tkinter Entry,Tkinter Layout,我使用tkinter时出错,我无法理解我的错误操作导致了此错误 这是我的代码: Traceback (most recent call last): File "C:/Users/Allen Alex Abraham/allensworld/allensworld/trial2.py", line 55, in <module> ln = int(ln) ValueError: **invalid literal for int() with base 10: ''**
Traceback (most recent call last):
File "C:/Users/Allen Alex Abraham/allensworld/allensworld/trial2.py", line 55, in <module>
ln = int(ln)
ValueError: **invalid literal for int() with base 10: ''**
从tkinter导入*
windows=Tk()
框架=框架(窗户,高度=200,宽度=700)
标题=标签(frame,text=“成本计算器”).grid(行=0,列=1,列span=7)
frame.pack()
def区域(长度、宽度):
全球范围
ftom(长度、宽度)
面积=长度*宽度
返回区
t1=标签(frame,text=“输入长度:”).grid(行=1,列=0)
e1=入口(帧)
e1.网格(行=1,列=1)
ln=e1.get()
e1.删除(0,结束)
t2=标签(frame,text=“输入宽度:”).grid(行=2,列=0)
e2=入口(框架)
e2.网格(行=2,列=1)
br=e2.get()
e2.删除(0,结束)
t3=标签(框,text=“总覆盖面积”).grid(行=3,列=0)
ln=int(ln)
br=int(br)
ar=面积(ln,br)
e3=标签(框架,文本=f“{ar}”)
e3.网格(行=3,列=1)
mainloop()
这就是我得到的错误:
Traceback (most recent call last):
File "C:/Users/Allen Alex Abraham/allensworld/allensworld/trial2.py", line 55, in <module>
ln = int(ln)
ValueError: **invalid literal for int() with base 10: ''**
回溯(最近一次呼叫最后一次):
文件“C:/Users/Allen Alex Abraham/allensworld/allensworld/trial2.py”,第55行,在
ln=int(ln)
ValueError:*基数为10的int()的文本无效:“”**
您的代码和问题很容易修复。也就是说,你真的需要添加一个问题的描述。可能不是每个人都清楚您的问题仅仅是基于代码。这被认为是一个糟糕的问题,很可能会被否决,并像现在这样得到最少的帮助
这意味着我会在这里改变一些事情
get()
方法会在代码启动时立即执行,因此要解决此问题,您需要将它们移动到函数中,然后在输入字段中添加某些内容后,使用按钮或绑定调用该函数get()。因此,类似于int(e1.get())
的东西将在这里工作。也就是说,为了防止在提交数字以外的内容时出错,您可以使用try/except
语句来处理错误
import tkinter as tk
windows = tk.Tk()
frame = tk.Frame(windows, height=200, width=700)
tk.Label(frame, text="COST CALCULATOR").grid(row=0, column=1, columnspan=7)
frame.pack()
tk.Label(frame, text="enter the length:").grid(row=1, column=0)
tk.Label(frame, text="enter the breadth:").grid(row=2, column=0)
tk.Label(frame, text="total area covered").grid(row=3, column=0)
e1 = tk.Entry(frame)
e2 = tk.Entry(frame)
e3 = tk.Label(frame, text=f"")
e1.grid(row=1, column=1)
e2.grid(row=2, column=1)
e3.grid(row=3, column=1)
def area_func():
ln = e1.get()
br = e2.get()
e1.delete(0, "end")
e2.delete(0, "end")
try:
area = int(ln) * int(br)
e3.config(text=f"{area}")
except BaseException as e:
print("Value error. Make sure you have only entered a valid integer.")
print(e)
tk.Button(frame, text="Submit", command=area_func).grid(row=4, column=0, columnspan=2)
windows.mainloop()
问题是,在创建entry小部件大约一毫秒后,在用户有机会输入数据之前,您正在调用
e1.get()
GUI编程与非GUI编程不同——小部件不会阻塞,直到用户以input
的方式输入内容。相反,您需要定义一个按钮或其他方式,以便用户在准备就绪时执行计算(菜单项、键盘绑定等)
最简单的解决方案是创建一个按钮来执行计算。单击按钮时,绑定到按钮的函数可以收集所需的数据,调用函数计算结果,然后用结果更新显示
例如,首先定义一个函数,该函数将获取数据并计算结果:
def do_calculation():
length = int(e1.get())
breadth = int(e2.get())
result = area(length, breadth)
e3.configure(text=result)
接下来,创建一个按钮,单击该按钮将调用此函数:
do_calc_button = Button(frame, command=do_calculation, text="Calculate")
do_calc_button.grid(row=4, column=0)
这样,用户可以输入值,单击按钮,然后查看结果。错误告诉您正在尝试将空字符串转换为整数,这显然是不可能的
ln
不是您假设的那样,因为您在创建entry小部件一毫秒后,在用户有机会键入任何内容之前就得到了它。entry()
不像input()
-它不等待用户的数据,所以。get()
为您提供空字符串-使用按钮()
要运行从条目
获取数据的代码,您需要将get()
代码放在函数中,然后添加一个调用该函数的按钮。嘿,对您的问题进行几句解释会很好。可能还有其他人有同样的问题。从代码复制/粘贴和编译器输出被视为无效问题。您在函数中使用的ftom
是什么?非常感谢您的回复,消除了我的许多困惑。刚开始使用stack overflow,这就是为什么我的问题结构很差/被问到的原因。非常感谢你的回答,你消除了我的许多困惑。