等待第二个 Gtk3 窗口关闭,并阻塞第一个窗口(Pyhton、Gtk、Linux)

问题描述 投票:0回答:1

我有一个带有按钮的主窗口,单击该按钮后会打开第二个窗口(请参阅下面的工作示例)。我想“阻止”第一个主窗口(例如,变灰)并等待第二个主窗口关闭(请参阅评论“在此等待”)。我必须做什么?

抱歉,我在互联网上找不到任何提示,这就是我在这里问的原因。

预先感谢您的帮助。

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()
python-3.x linux gtk3
1个回答
0
投票

使用
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()
© www.soinside.com 2019 - 2024. All rights reserved.