Tkinter TopLevel窗口异常:点击按钮弹出双窗口且样式异常
Tkinter点击按钮弹出两个TopLevel窗口的问题修复
问题现象
点击"Choisir sa classe"按钮时,仅调用一次load_window2(),却弹出两个窗口:
- 一个是空白无背景色的窗口
- 另一个是设置了
#D13C3C背景色的目标窗口
问题原因
- 当调用
window1.destroy()销毁主Tk窗口时,Tkinter框架会自动创建一个新的空白主窗口(因为Tk应用必须保持至少一个主窗口存在),这个就是那个无背景色的多余窗口 - 另一个窗口是
load_window2()中手动创建的Toplevel实例,也就是你期望显示的窗口
解决方案
不要直接销毁主窗口,改用window1.withdraw()隐藏主窗口,避免触发Tkinter自动创建新主窗口的行为。同时可以给新窗口绑定关闭事件,在关闭时恢复主窗口或者直接退出程序。
修复后的完整代码
from tkinter import * def open_HighKhala_channel(): # 补充缺失的函数实现,比如打开网页等 pass def do_music(): # 补充缺失的函数实现 pass def load_window1(): yt_buttun.pack(side=LEFT) class_buttun.pack(side=LEFT) music_buttun.pack(side=RIGHT) label_tittle.pack() buttun_frame.pack() print("fenetre 1 / page d'acceuil affiché") window1.mainloop() def load_window2(): # fenetre choisir classe window2 = Toplevel() window2.config(background="#D13C3C") # 绑定关闭事件:关闭window2时恢复显示主窗口window1 def on_window2_close(): window2.destroy() window1.deiconify() window2.protocol("WM_DELETE_WINDOW", on_window2_close) # Composants --> deuxieme page label_tittle2 = Label(window2, text="choisi ton programme de révision", font=("Courrier", 40), bg="#41B77F", fg='white') buttun_frame2 = Frame(window2, bg='#41B77F', bd=2, relief=SUNKEN) buttun5m = Button(buttun_frame2, text="5eme", font=("Courrier", 60), bg="#D13C3C", fg='#41B77F', command=open_HighKhala_channel) buttun4m = Button(buttun_frame2, text="4eme", font=("Courrier", 60), bg="#359AF1", fg='white', command=do_music) buttun3m = Button(buttun_frame2, text="3eme", font=("Courrier", 60), bg="#9962D8", fg='black', command=do_music) label_tittle2.pack() buttun_frame2.pack() buttun5m.pack() buttun4m.pack() buttun3m.pack() print("fenetre 2 / page choisir classe affiché") def switch_to_window2(): # 隐藏主窗口而非销毁 window1.withdraw() load_window2() # fenetre acceuil window1 = Tk() window1.attributes('-fullscreen', True) window1.bind('<Escape>', lambda e: window1.destroy()) window1.config(background='#41B77F') # Composants --> première page label_tittle = Label(window1, text="Appli d'Erkan pour le BREVET", font=("Courrier", 40), bg="#41B77F", fg='white') buttun_frame = Frame(window1, bg='#41B77F', bd=2, relief=SUNKEN) yt_buttun = Button(buttun_frame, text="Ma Chaine YT", font=("Courrier", 40), bg="#D13C3C", fg='#41B77F', command=open_HighKhala_channel) # 修改按钮绑定的函数为switch_to_window2 class_buttun = Button(buttun_frame, text="Choisir sa classe", font=("Courrier", 40), bg="#359AF1", fg='white', command=switch_to_window2) music_buttun = Button(buttun_frame, text="Un peu de musique", font=("Courrier", 40), bg="#9962D8", fg='black', command=do_music) load_window1()
关键修改点
- 将原
destroy_window1函数重命名为switch_to_window2,并把window1.destroy()替换为window1.withdraw(),隐藏主窗口 - 给
window2添加WM_DELETE_WINDOW协议绑定,关闭新窗口时恢复显示主窗口(可选,根据需求调整) - 补充了原代码中缺失的
open_HighKhala_channel和do_music函数的空实现,避免运行报错
内容的提问来源于stack exchange,提问作者HighKhala
相关产品推荐
相关产品推荐

