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

Python Gtk3 Linux下实现阻塞主窗口等待子窗口关闭

解决方案:使用模态窗口+临时事件循环实现阻塞等待

要实现点击按钮后主窗口置灰并等待第二个窗口关闭,你可以利用Gtk的模态窗口特性,配合临时的事件循环来达到阻塞效果,具体修改如下:

修改后的完整代码

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class SecondWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Window 2")
        self.set_border_width(50)

        self.button = Gtk.Button(label="Close second window")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print("Window_2: button clicked")
        self.close()

class FirstWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="MAIN --Window 1 --")
        self.set_border_width(100)

        self.button = Gtk.Button(label="Open second window")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print("Second window")
        win_2 = SecondWindow()
        
        # 1. 将主窗口置灰(禁用所有交互)
        self.set_sensitive(False)
        
        # 2. 设置第二个窗口为模态窗口,指定父窗口为主窗口,确保阻塞主窗口交互
        win_2.set_modal(True)
        win_2.set_transient_for(self)
        
        # 3. 绑定关闭信号回调:恢复主窗口状态并退出临时事件循环
        def on_win2_destroy(window):
            self.set_sensitive(True)
            Gtk.main_quit()
        
        win_2.connect("destroy", on_win2_destroy)
        
        win_2.show_all()
        
        # 启动临时事件循环,代码将阻塞在此处直到第二个窗口关闭
        Gtk.main()

        print("After second window has been closed")

win = FirstWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

关键逻辑说明

  • 主窗口置灰:通过self.set_sensitive(False)禁用主窗口所有控件的交互能力,实现视觉上的置灰效果。
  • 模态窗口配置:set_modal(True)让第二个窗口成为模态窗口,set_transient_for(self)绑定父窗口,确保系统层面限制用户操作主窗口。
  • 临时事件循环:调用Gtk.main()启动临时循环后,代码会停在此处;当第二个窗口关闭触发destroy信号时,回调函数恢复主窗口可操作性并调用Gtk.main_quit()退出临时循环,后续代码才会继续执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:57:21