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
相关产品推荐
相关产品推荐

