Tkinter点击按钮创建输入框求和报错:NameError: EntryNew未定义
问题分析与解决
你遇到的NameError本质原因有两个:
EntryNew是NewElement方法里的局部变量,方法执行完毕后就会被销毁,summing方法根本访问不到它;- 就算能访问到,每次点击"add"创建的新输入框都会覆盖之前的
EntryNew,最终你也只能拿到最后一个输入框的值,没法实现所有输入框的求和。
修复方案
我们需要把所有动态创建的输入框存储起来,用类的实例变量来维护这个集合,这样NewElement和summing方法都能访问到。具体步骤:
- 在类的
__init__方法里初始化一个列表,用来保存所有动态创建的Entry对象; - 每次创建新输入框时,把它添加到这个列表中;
- 求和时遍历这个列表,逐个获取输入值并累加。
修改后的完整代码
from tkinter import * from tkinter import ttk myApp = Tk() myApp.title("Kalkulator za materijal") myApp.geometry("450x850") Label1 = Label(myApp, text="Answer") Label1.grid(row=0, column=0) Entry1 = Entry(myApp) Entry1.grid(row=1, column=0) ColumnNumber = 1 class ConcreteElement(object): def __init__(self): # 初始化列表存储所有动态创建的输入框 self.entries = [] newbutton = Button(myApp, text="add", command=self.NewElement) newbutton.grid(row=4, column=0) buttonsum = Button(myApp, text="sum", command=self.summing) buttonsum.grid(row=2, column=0) def NewElement(self): global ColumnNumber ColumnNumber += 1 LabelNew = Label(myApp, text="New Entry") LabelNew.grid(row=0, column=ColumnNumber) # 创建输入框 EntryNew = Entry(myApp) EntryNew.grid(row=1, column=ColumnNumber) # 将输入框添加到实例列表中 self.entries.append(EntryNew) def summing(self): x = 0 # 遍历所有存储的输入框,逐个取值累加 for entry in self.entries: # 这里加了异常处理,防止输入非数字导致崩溃 try: x += float(entry.get()) except ValueError: # 输入非数字时跳过,也可以改成弹窗提示用户 pass Entry1.delete(0, "end") Entry1.insert(0, x) ConcreteElement = ConcreteElement() myApp.mainloop()
额外优化建议
- 可以进一步替换
global变量ColumnNumber为类的实例变量,让代码更模块化; - 给动态输入框添加清空按钮,方便用户删除不需要的输入项;
- 若需要更友好的提示,可以在用户输入非数字时弹出错误提示框。
内容的提问来源于stack exchange,提问作者Aleksandar Beat
相关产品推荐
相关产品推荐

