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

如何在Python中打开模态窗口时禁用主窗口的关闭按钮

解决主窗口关闭按钮在模态窗口打开时禁用的问题

嘿,我来帮你搞定这个需求!要实现打开模态窗口时禁用主窗口的关闭按钮(X按钮),我们可以通过修改主窗口的WM_DELETE_WINDOW协议回调来实现——简单来说就是暂时替换掉主窗口X按钮的功能,等模态窗口关闭后再恢复回来。

下面是修改后的完整代码,我会详细标注关键步骤:

from tkinter import *
from tkinter import messagebox

class Gameover(object):
    def __init__(self, main_root):
        self.main_root = main_root  # 保存主窗口的引用,方便后续操作
        self.original_close_callback = None  # 用来存储主窗口原本的关闭回调函数

    def start(self):
        # 第一步:保存主窗口原来的关闭按钮回调
        self.original_close_callback = self.main_root.protocol("WM_DELETE_WINDOW")
        
        # 第二步:设置临时的关闭回调——点击主窗口X按钮时的响应
        def temp_close_action():
            # 这里可以选择提示用户,或者直接pass不做任何操作
            messagebox.showinfo("提示", "请先关闭游戏结束窗口哦")
        
        self.main_root.protocol("WM_DELETE_WINDOW", temp_close_action)

        # 第三步:创建模态窗口(注意用Toplevel而非Tk,避免创建新的主窗口)
        self.modal_root = Toplevel(self.main_root)
        self.modal_root.title('Gameover')
        
        # 设置窗口为模态:锁定焦点,阻止用户操作主窗口
        self.modal_root.grab_set()
        # 绑定模态窗口的关闭事件,用来恢复主窗口的功能
        self.modal_root.protocol("WM_DELETE_WINDOW", self.on_modal_close)

        # 可以在这里添加模态窗口的内容,比如关闭按钮
        close_btn = Button(self.modal_root, text="关闭游戏窗口", command=self.on_modal_close)
        close_btn.pack(padx=30, pady=20)

        # 让主程序等待模态窗口关闭后再继续
        self.main_root.wait_window(self.modal_root)

    def on_modal_close(self):
        # 第四步:恢复主窗口原本的关闭按钮功能
        if self.original_close_callback:
            self.main_root.protocol("WM_DELETE_WINDOW", self.original_close_callback)
        else:
            # 如果主窗口原本没有自定义回调,就恢复默认的关闭行为
            self.main_root.protocol("WM_DELETE_WINDOW", self.main_root.destroy)
        
        # 关闭模态窗口
        self.modal_root.destroy()

# 主程序入口
if __name__ == "__main__":
    main_window = Tk()
    main_window.title("游戏主窗口")
    # 添加打开模态窗口的按钮
    open_modal_btn = Button(main_window, text="触发游戏结束", command=Gameover(main_window).start)
    open_modal_btn.pack(padx=50, pady=50)
    
    main_window.mainloop()

关键逻辑说明:

  • 保存原回调:我们先把主窗口原本的关闭按钮功能存起来,这样模态窗口关闭后可以完美恢复,不会破坏原有逻辑。
  • 临时替换回调:打开模态窗口时,把主窗口的关闭按钮功能换成自定义的(比如提示用户),这样点击主窗口X按钮就不会关闭主窗口了。
  • 模态窗口设置:用Toplevel创建模态窗口,配合grab_set()和wait_window()实现真正的模态效果——用户必须先处理模态窗口才能回到主窗口。
  • 恢复原功能:当模态窗口关闭时,不管是点击窗口X还是自定义按钮,都会触发恢复主窗口关闭按钮的逻辑,保证后续主窗口功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:23:13