我有一个带有按钮的主窗口,单击该按钮后会打开第二个窗口(请参阅下面的工作示例)。我想“阻止”第一个主窗口(例如,变灰)并等待第二个主窗口关闭(请参阅评论“在此等待”)。我必须做什么?
抱歉,我在互联网上找不到任何提示,这就是我在这里问的原因。
预先感谢您的帮助。
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()
win_2.show_all()
#
# Wait here !
#
print("After second window has been closed")
win = FirstWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
Gtk.Dialog
这可以使用
Gtk.Dialog
来实现。幸运的是,您的代码不需要进行太多更改;只是处理 Dialog
的一些不同之处。完整的工作示例将位于此答案的底部。
SecondWindow
课程为了让您的
SecondWindow
类能够与 Dialog
一起使用,您需要更改一些内容。首先,显然是让它继承 Gtk.Dialog
而不是 Gtk.Window
。其次,由于 Dialogs
需要有一个可以“阻止”的父窗口,因此您需要向 parent
方法添加 SecondWindow.__init__()
参数,并在调用 时将其传递给
parent
参数super().__init__()
:
...
class SecondWindow(Gtk.Dialog): # Inherit from Dialog
def __init__(self, parent): # Add a `parent` parameter
super().__init__(parent=parent, title="Window 2") # Use the `parent` parameter
...
Gtk.Dialog
和Gtk.Window
之间的另一个区别是,Gtk.Dialog
内部已经有一个Gtk.Box
,然后您可以将孩子放入其中。要获取此框,您可以调用dialog.get_content_area()
,然后添加您的按钮:
...
self.button = Gtk.Button(label="Close second window")
self.button.connect("clicked", self.on_button_clicked)
self.area = self.get_content_area() # Get the dialog's content area
self.area.add(self.button) # Add the button to the content area
...
最后,使用
Dialog
时,您需要修改打开和关闭辅助窗口的方式。
为了正确地open一个
Dialog
,你需要在调用run()
之后调用它的show_all()
方法。 run()
方法确保 Dialog
阻塞其父窗口,直到其关闭:
...
win_2 = SecondWindow(self)
win_2.show_all()
win_2.run() # Run the dialog
...
为了正确关闭对话框,您可以调用
destroy()
而不是close()
(close()
不会立即关闭对话框):
...
def on_button_clicked(self, widget):
print("Window_2: button clicked")
self.destroy() # Close the dialog
...
此外,为了使对话框一角的 X 按钮正常工作,您需要将
destroy()
方法连接到 "delete-event"
信号:
...
self.set_border_width(50)
self.connect("delete-event", lambda *_: self.destroy())
...
lambda *_
用于捕获事件可能传递给 destroy()
的任何参数。
这是对代码的完整工作修改,利用了上述更改:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
class SecondWindow(Gtk.Dialog):
def __init__(self, parent):
super().__init__(parent=parent, title="Window 2")
self.set_border_width(50)
self.connect("delete-event", lambda *_: self.destroy())
self.button = Gtk.Button(label="Close second window")
self.button.connect("clicked", self.on_button_clicked)
self.area = self.get_content_area()
self.area.add(self.button)
def on_button_clicked(self, widget):
print("Window_2: button clicked")
self.destroy()
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(self)
win_2.show_all()
win_2.run()
print("After second window has been closed")
win = FirstWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()