You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免Python Tkinter登录窗口关闭时终止整个程序?

解决Tkinter登录窗口关闭导致整个程序退出的问题

核心问题分析

  1. quit() 方法会终止Tkinter的主事件循环,直接导致整个程序退出,而非仅关闭当前窗口。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:45:46