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

Tkinter TopLevel窗口异常:点击按钮弹出双窗口且样式异常

Tkinter点击按钮弹出两个TopLevel窗口的问题修复

问题现象

点击"Choisir sa classe"按钮时,仅调用一次load_window2(),却弹出两个窗口:

  • 一个是空白无背景色的窗口
  • 另一个是设置了#D13C3C背景色的目标窗口

问题原因

  1. 当调用window1.destroy()销毁主Tk窗口时,Tkinter框架会自动创建一个新的空白主窗口(因为Tk应用必须保持至少一个主窗口存在),这个就是那个无背景色的多余窗口
  2. 另一个窗口是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()

关键修改点

  1. 将原destroy_window1函数重命名为switch_to_window2,并把window1.destroy()替换为window1.withdraw(),隐藏主窗口
  2. 给window2添加WM_DELETE_WINDOW协议绑定,关闭新窗口时恢复显示主窗口(可选,根据需求调整)
  3. 补充了原代码中缺失的open_HighKhala_channel和do_music函数的空实现,避免运行报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:07:03