You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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访问它,自然找不到这个实例属性。

修正步骤

  1. 将需要跨方法访问的变量绑定为实例属性,即在变量名前加上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)
  1. 调整get_inputs方法的缩进,使其与__init__方法同级(当前缩进属于__init__内部,会导致方法定义无效)。

  2. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:30:53