You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Tkinter单选按钮回调报错AttributeError: '_tkinter.tkapp' object has no attribute 'text'的原因咨询

解决Tkinter中AttributeError: '_tkinter.tkapp' object has no attribute 'text'的问题

咱们先拆解下你遇到的这个错误根源:

你在gui()方法里,创建完第一个单选按钮self.radiomp3后,立刻调用了self.radiomp3.invoke()——这行代码会马上触发绑定的dreiodervier()方法。但此时self.text这个Text组件还没被创建呢!它的定义和打包代码都在invoke()之后,所以当dreiodervier()试图访问self.text的时候,这个属性根本还不存在,自然就抛出了AttributeError

知道问题出在哪就好办了,只需要调整代码顺序:把self.radiomp3.invoke()的调用移到self.text创建并打包之后,确保触发回调时目标组件已经存在。

修改后的完整代码如下:

import tkinter as tk
class Application(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.container = tk.Frame(self)
        self.container.pack(fill="both", expand = True)
        self.gui()
    def gui(self):
        self.var = tk.IntVar()
        self.radiomp3 = tk.Radiobutton(self.container, variable = self.var, value = 1, command = lambda:self.dreiodervier())
        self.radiomp3.pack()
        self.mp4 = tk.Radiobutton(self.container, variable = self.var, value = 2, command = lambda:self.dreiodervier())
        self.mp4.pack()
        # 先创建并打包Text组件
        self.text = tk.Text(self.container, borderwidth=0, highlightthickness=0, width=40)
        self.text.pack()
        # 再触发单选按钮的回调
        self.radiomp3.invoke()
    def dreiodervier(self):
        choice = self.var.get()
        if choice == 1:
            self.text.insert("end", "\ntop")
        else:
            self.text.insert("end", "\nbottom")
app = Application()
app.mainloop()

这样调整后,当invoke()触发dreiodervier()时,self.text已经被正确初始化,就能正常执行文本插入操作,不会再出现报错了。

内容的提问来源于stack exchange,提问作者neewbie

火山引擎 最新活动