【问题标题】:a tkinter program error i cant seem to get rid of我似乎无法摆脱的 tkinter 程序错误
【发布时间】:2020-01-28 17:28:30
【问题描述】:

我在使用 tkinter 时遇到错误,我无法理解我做错了什么导致了这个错误。

这是我的代码:

from tkinter import *

windows = Tk()
frame = Frame(windows,height = 200 ,width  = 700)
heading = Label(frame,text="COST CALCULATOR").grid(row = 0,column = 1,columnspan =7)
frame.pack()

def area(length,breadth):
    global area
    ftom(length,breadth)
    area = length*breadth
    return area

t1 = Label(frame,text = "enter the length:").grid(row = 1 ,column = 0)
e1 = Entry(frame)
e1.grid(row =1,column = 1)
ln = e1.get()
e1.delete(0,END)

t2 = Label(frame,text = "enter the breadth:").grid(row = 2 ,column = 0)
e2 = Entry(frame)
e2.grid(row = 2,column = 1)
br = e2.get()
e2.delete(0,END)

t3 = Label(frame,text = "total area covered").grid(row = 3 ,column = 0)
ln = int(ln)
br = int(br)
ar = area(ln,br)
e3 = Label(frame,text =f"{ar}")
e3.grid(row = 3 , column = 1)
windows.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: ''**

【问题讨论】:

  • 错误告诉您您正在尝试将空字符串转换为整数,这显然是不可能的。 ln 不是您所假设的,因为您在创建条目小部件后的一毫秒内得到它,远在用户有机会输入任何内容之前。
  • Entry() 不像 input() 那样工作 - 它不等待用户的数据,所以 .get() 给你空字符串 - 使用 Button() 运行从 @987654328 获取数据的代码@
  • 您需要将get() 代码放在函数内,然后添加一个调用该函数的按钮。
  • 嘿,对你的问题解释几句就好了。可能还有其他人有同样的问题。从代码复制/粘贴,编译器输出不被认为是一个有效的问题。
  • 你在函数中使用的ftom是什么?

标签: python python-3.x tkinter tkinter-entry tkinter-layout


【解决方案1】:

问题是您在创建条目小部件后大约一毫秒调用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)

这样,用户可以输入值,单击按钮,然后查看结果。

【讨论】:

  • 非常感谢您的回复,您解决了我的许多困惑。
【解决方案2】:

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

也就是说我会在这里改变一些东西。

  1. 如果导入 *,请改用 import tkinter as tk,因为这将有助于防止以后覆盖方法。

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

  3. get() 始终返回一个字符串,因此在将值转换为整数或浮点数之前,您的数学运算不会起作用。所以像int(e1.get()) 这样的东西会在这里工作。也就是说,为了防止在提交数字以外的内容时出现错误,您可以使用 try/except 语句来处理错误。

  4. 不要将函数和变量命名为同一个东西。这可能会导致问题,因此您的变量/函数/类等始终具有唯一的名称。

看看下面的代码,如果您有任何问题,请告诉我:

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

【讨论】:

  • 非常感谢您的回复消除了我的许多困惑。刚开始使用堆栈溢出,这就是为什么我的问题结构/问得非常糟糕。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多