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

