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




