Tkinter如何销毁旧主循环并从托盘模块创建新主窗口
解决方案
你当前的写法存在两个核心错误:
- 模块导入是单例的,
from main import root只会在第一次导入时创建root对象,你调用self.master.destroy()之后这个root对象已经被销毁,后续导入拿到的是无效对象,无法再使用 root.mainloop()全局只能调用一次,重复调用会触发tkinter运行异常
方案1:复用根窗口(推荐,性能更高无异常风险)
不用销毁root,登录后隐藏根窗口,登出后直接清空根窗口内容重新加载登录表单即可,仅需修改tray.py的登出逻辑:
def sign_out(self): # 先销毁托盘对象自身 self.destroy() # 清空根窗口上的所有现有组件 for widget in self.master.winfo_children(): widget.destroy() # 重新加载登录表单 import signin signin = signin.Signin(self.master) signin.show_form() # 重新显示根窗口 self.master.deiconify()
方案2:确实需要销毁旧根窗口重建的场景
如果你的业务必须要销毁旧窗口重建,调整启动逻辑,不要把root定义为全局变量即可:
- 修改
main.py代码:
import tkinter as tk from signin import Signin def run_app(): root = tk.Tk() signin = Signin(root) signin.show_form() root.mainloop() if __name__ == "__main__": run_app()
- 修改
tray.py的登出逻辑:
def sign_out(self): # 销毁旧的根窗口 self.master.destroy() # 销毁托盘自身 self.destroy() # 重新调用启动函数创建全新的根窗口和登录表单 from main import run_app run_app()
内容的提问来源于stack exchange,提问作者Intellial solutions
相关产品推荐
相关产品推荐

