Tkinter类开发问题:Entry绑定StringVar仍报AttributeError
问题描述
我正在学习Python的Tkinter与面向对象编程,开发一个简易应用题生成器,点击“Create Document”按钮(绑定了调用.get()方法的函数)时出现AttributeError。已排查缩进、拼写、变量类型等问题,也查过线上资源但大多不涉及类或内容太简略,想知道哪里出错,或求合适的学习资源。
错误信息
Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\riley\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__ return self.func(*args) File "C:\Users\riley\Documents\Pyth\Test.py", line 174, in get_inputs minadd = self.e_add_minvar.get() AttributeError: 'BigWindow' object has no attribute 'e_add_minvar'
相关代码
rad_font = ('Cambria', 20) class BigWindow: def __init__(self, root, title, geometry): self.root = root self.root.title(title) self.root.geometry(geometry) #labels for columns operator_label = Label(self.root, text = 'Choose options', font = ('cambria', 20, 'bold')) operator_label.grid(row = 0, column = 0) #create check buttons addbutt = IntVar() subbutt = IntVar() multbutt = IntVar() divbutt = IntVar() Check1 = Checkbutton(self.root, text = 'Addition', variable = addbutt, onvalue = 1, offvalue =0, font = rad_font, pady = 40) Check1.grid(row = 1, column = 0, sticky = 'W') Check2 = Checkbutton(self.root, text = 'Subtraction', variable = subbutt, onvalue = 1, offvalue =0, font = rad_font, pady = 40) Check2.grid(row = 2, column = 0, sticky = 'W') Check3 = Checkbutton(self.root, text='Multiplication', variable=multbutt, onvalue = 1, offvalue =0, font = rad_font, pady = 40) Check3.grid(row=3, column=0, sticky = 'W') Check4 = Checkbutton(self.root, text='Division', variable=divbutt, onvalue=1, offvalue = 0, font = rad_font, pady = 40) Check4.grid(row=4, column=0, sticky = 'W') #entry widgets for min max e_add_minvar = StringVar() e_add_minvar.set('32') e_add_min = Entry(self.root, bd = 4, relief = 'sunken', textvariable = e_add_minvar, selectborderwidth = 5, font = ('Calibri', 20), width = 8) e_add_min.grid(column = 1, row = 1, padx = 40) #create/submit button create_button = Button(self.root, text = 'Create Document', command = self.get_inputs) create_button.grid(row = 3, column = 4) self.root.mainloop() #function to get all inputs to connect to submit/create button def get_inputs(self): minadd = self.e_add_minvar.get() print(minadd) class Main: proot = Tk() Window1 = BigWindow(root, "Word Problem Generator", "900x500") Main()
解决方案
核心错误原因
你在__init__方法里定义的e_add_minvar是局部变量,仅在__init__的作用域内有效,而get_inputs方法尝试通过self.e_add_minvar访问它,自然找不到这个实例属性。
修正步骤
- 将需要跨方法访问的变量绑定为实例属性,即在变量名前加上
self.:
#entry widgets for min max self.e_add_minvar = StringVar() self.e_add_minvar.set('32') e_add_min = Entry(self.root, bd = 4, relief = 'sunken', textvariable = self.e_add_minvar, selectborderwidth = 5, font = ('Calibri', 20), width = 8) e_add_min.grid(column = 1, row = 1, padx = 40)
调整
get_inputs方法的缩进,使其与__init__方法同级(当前缩进属于__init__内部,会导致方法定义无效)。修复
Main类里的变量引用错误:
class Main: def __init__(self): self.proot = Tk() self.Window1 = BigWindow(self.proot, "Word Problem Generator", "900x500") Main()
学习建议
- 先扎实掌握Python面向对象基础:明确实例属性、局部变量、类属性的区别与作用域。
- Tkinter类式开发重点:把需要在多个方法中访问的控件、变量都绑定为实例属性(
self.xxx),避免局部变量无法跨方法访问的问题。 - 可以拆解成熟的Tkinter类项目代码,理解其中的属性和方法组织逻辑。
内容的提问来源于stack exchange,提问作者Riley Morris
相关产品推荐
相关产品推荐

