Python 一个我似乎无法摆脱的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: ''**

我使用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: ''**
从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()的文本无效:“”**

您的代码和问题很容易修复。也就是说,你真的需要添加一个问题的描述。可能不是每个人都清楚您的问题仅仅是基于代码。这被认为是一个糟糕的问题,很可能会被否决,并像现在这样得到最少的帮助

这意味着我会在这里改变一些事情

  • 如果导入*,请将tkinter作为tk导入,因为这将有助于防止以后重写方法

  • 您的
    get()
    方法会在代码启动时立即执行,因此要解决此问题,您需要将它们移动到函数中,然后在输入字段中添加某些内容后,使用按钮或绑定调用该函数

  • get()。因此,类似于
    int(e1.get())
    的东西将在这里工作。也就是说,为了防止在提交数字以外的内容时出错,您可以使用
    try/except
    语句来处理错误

  • 不要将函数和变量命名为同一事物。这可能会导致问题,因此始终为变量/函数/类等指定uniquer名称

  • 请查看以下代码,如果您有任何问题,请告诉我:

    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,这就是为什么我的问题结构很差/被问到的原因。非常感谢你的回答,你消除了我的许多困惑。