如何避免Python Tkinter登录窗口关闭时终止整个程序?
解决Tkinter登录窗口关闭导致整个程序退出的问题
核心问题分析
quit()方法会终止Tkinter的主事件循环,直接导致整个程序退出,而非仅关闭当前窗口。Login类继承了tk.Tk,作为主窗口实例,关闭它会直接结束整个程序的事件循环。如果程序存在主界面,应将登录窗口设为子窗口而非独立主窗口。
修复方案
方案1:修改关闭方法,仅销毁登录窗口
让 LoginFrame 持有登录窗口实例,调用 destroy() 而非 quit() 来关闭窗口:
class LoginFrame(ttk.Frame): def __init__(self, container): super().__init__(container) self.container = container # 保存登录窗口实例 self.__createMain__() def __createMain__(self): # 其他控件代码... Button2 = Button(self, text='Close', command=self.Closes).place(x=200, y=140) def Closes(self): self.container.destroy() # 仅销毁登录窗口 class Login(tk.Tk): def __init__(self): super().__init__() self.title('Login Form') self.geometry('350x300') self.minsize(200,300) self.maxsize(500,500) self.__create_widgets() def __create_widgets(self): First_Frame = LoginFrame(self) First_Frame.place(height=200, width=700, x=20, y=20)
方案2:将登录窗口改为子窗口(多场景推荐)
若程序存在主界面,将 Login 改为继承 tk.Toplevel(子窗口),避免多个主Tk实例引发的问题:
class LoginFrame(ttk.Frame): def __init__(self, container): super().__init__(container) self.container = container self.__createMain__() def __createMain__(self): # 其他控件代码... Button2 = Button(self, text='Close', command=self.Closes).place(x=200, y=140) def Closes(self): self.container.destroy() class Login(tk.Toplevel): # 改为继承Toplevel def __init__(self, parent): # 接收主窗口作为父容器 super().__init__(parent) self.title('Login Form') self.geometry('350x300') self.minsize(200,300) self.maxsize(500,500) self.__create_widgets() def __create_widgets(self): First_Frame = LoginFrame(self) First_Frame.place(height=200, width=700, x=20, y=20) # 主程序示例 class MainApp(tk.Tk): def __init__(self): super().__init__() self.title('主界面') self.geometry('800x600') # 打开登录窗口并等待其关闭 self.login_window = Login(self) self.wait_window(self.login_window) if __name__ == "__main__": app = MainApp() app.mainloop()
补充:统一处理右上角关闭按钮
若希望点击登录窗口右上角叉号也仅关闭窗口,可在 Login 类的 __init__ 中添加:
self.protocol("WM_DELETE_WINDOW", self.destroy)
内容的提问来源于stack exchange,提问作者Maddos
相关产品推荐
相关产品推荐

