Python Tkinter开发报'Application'无rp_toggle_button属性如何解决
报错原因
你在定义按钮的command参数时直接执行了threading.Thread(...).start(),该逻辑会在Button类实例化的过程中就立刻运行,而此时self.rp_toggle_button还没有完成赋值——Python会先计算等号右侧的所有参数(包括Button的command参数),再将生成的Button实例赋值给左侧的self.rp_toggle_button属性。当线程提前调用rp_toggle函数时,函数内部要访问的self.rp_toggle_button属性还不存在,就会抛出对应的AttributeError。
同时你直接把thread.start()的返回值(None)传给了command参数,本身也不符合按钮回调需要传入可调用对象的要求。
修复方案
将线程创建和启动的逻辑用lambda匿名函数包裹,保证只有按钮被点击时才会执行对应逻辑,此时self.rp_toggle_button已经完成赋值,不会出现属性不存在的问题。
修改按钮定义的代码行即可:
# 原错误代码 # self.rp_toggle_button = Button(text = "Start Rich Presence", activeforeground = "#808080", command = threading.Thread(target = self.rp_toggle, args = (options_tk,)).start()) # 修改后代码 self.rp_toggle_button = Button(text = "Start Rich Presence", activeforeground = "#808080", command = lambda: threading.Thread(target = self.rp_toggle, args = (options_tk,)).start())
额外优化建议
Tkinter的所有UI组件都不是线程安全的,禁止在子线程中直接修改组件属性(比如你代码中修改按钮text的操作),否则可能出现界面无响应、崩溃等问题。如果presence.connect_rpc、presence.update_rpc是耗时阻塞操作,可以将这部分逻辑放在子线程执行,修改按钮文本的操作通过self.master.after()调度到主线程执行。
内容的提问来源于stack exchange,提问作者OmarMZ
相关产品推荐
相关产品推荐

