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

Tkinter登录成功后如何销毁Window1并打开Window2?

解决Tkinter登录后关闭原窗口并保留新窗口的问题

我来帮你搞定这个问题!你遇到的核心问题有两个:一是直接调用Window1().destroy()时没有传入必要的master参数导致报错,二是用Toplevel创建的Window2是原窗口的子窗口,所以原窗口会一直显示。下面是具体的解决方案:

问题分析

你之前用Toplevel(self.master)创建Window2,它本质是原窗口(root)的子窗口,所以原窗口会持续显示。而错误调用Window1().destroy()是因为你没有给Window1的构造函数传master参数——它必须接收一个父窗口对象才能完成实例化。

正确实现方式

我们可以直接销毁原有的主窗口(root),然后创建一个新的主窗口作为Window2的容器,这样登录成功后就只会保留Window2。修改login_system方法即可:

def login_system(self):
    u = self.UsernameEntry.get()
    if u == "one":
        # 销毁原登录窗口的主容器(root)
        self.master.destroy()
        # 创建新的主窗口
        new_root = Tk()
        # 将新窗口作为Window2的master
        self.app = Window2(new_root)
        # 启动新窗口的事件循环
        new_root.mainloop()
    else:
        self.UsernameEntry.delete(0,"end")

完整修改后的代码

from tkinter import *
from tkinter import DISABLED, messagebox
import tkinter.ttk as ttk
import os
import glob
from PIL import Image, ImageTk, ImageGrab
from pathlib import Path
import pyautogui
import time

def main():
    root = Tk()
    app = Window1(root)
    root.mainloop()

class Window1:
    def __init__(self,master):
        self.master = master
        self.master.title("User Log In")
        self.master.geometry('1000x750')
        self.frame = Frame(self.master)
        self.frame.pack(fill="both", expand=True)
        self.UsernameEntry = Entry(self.frame)
        self.UsernameEntry.grid(row = 2, column = 0)
        self.btnLogin = Button(self.frame, text = 'login', width = 17, command = self.login_system)
        self.btnLogin.grid(row = 3, column = 0)
    
    def login_system(self):
        u = self.UsernameEntry.get()
        if u == "one":
            # 销毁原窗口
            self.master.destroy()
            # 创建新主窗口并启动Window2
            new_root = Tk()
            self.app = Window2(new_root)
            new_root.mainloop()
        else:
            self.UsernameEntry.delete(0,"end")

class Window2:
    def __init__(self,master):
        self.master = master  # 保存master引用,方便后续操作
        self.master.title("Main Application")  # 给主界面添加标题
        notebook = ttk.Notebook(master)
        notebook.pack(expand = 1, fill = "both")
        # Frames
        main = ttk.Frame(notebook)
        manual = ttk.Frame(notebook)
        notebook.add(main, text='Main-Screen')
        notebook.add(manual, text='Manual')

if __name__ == '__main__':
    main()

额外优化建议

  • 给Window2添加标题,让界面功能更清晰
  • 在Window2的__init__中保存self.master引用,方便后续对窗口进行关闭、调整大小等操作

内容的提问来源于stack exchange,提问作者user12121219

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:05:35