我想要一个对话框窗口,其中一些按钮关闭对话框,而其他按钮则不关闭。我这样做的方法是使用response
来自对话框的信号Gtk.Dialog
来调用emit_stop_by_name('response')
。(如果有人知道这样做的更好方法,那可能会抢占这个问题的其余部分。)
这在我使用 PyGTK 时有效。我现在要迁移到 PyGObject .. 似乎只有当我手动连接到响应信号而不是使用Gtk.Builder.connect_signals()
.
但不要相信我的话。这是我的问题的一个最小示例:
from gi.repository import Gtk
xml = """<interface>
<object class="GtkDialog" id="dialog1">
<signal name="response" handler="on_response"/>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<child>
<object class="GtkButton" id="button1">
<property name="label">Don't Close Dialog</property>
<property name="visible">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">Close Dialog</property>
<property name="visible">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">button1</action-widget>
<action-widget response="-6">button2</action-widget>
</action-widgets>
</object>
</interface>
"""
def on_button_clicked(widget):
d = DummyDialog()
d.dialog1.run()
d.dialog1.destroy()
class DummyDialog:
def __init__(self):
self.builder = Gtk.Builder()
self.builder.add_from_string(xml)
self.dialog1 = self.builder.get_object('dialog1')
self.builder.connect_signals(self)
def on_response(self, widget, response, data=None):
print 'response:', response
if response >= 0:
widget.emit_stop_by_name('response')
w = Gtk.Window()
w.connect('destroy', Gtk.main_quit)
b = Gtk.Button('Open Dialog')
b.connect('clicked', on_button_clicked)
w.add(b)
w.show_all()
Gtk.main()
当你运行它时,你会得到一个带有单个按钮的窗口。当您单击该按钮时,会弹出一个对话框,其中包含两个按钮,一个标记为“不关闭对话框”,另一个标记为“关闭对话框”。运行上面的代码时,两个按钮都会关闭对话框。
但是,如果您从使用更改为Gtk.Builder.connect_signals()
通过替换手动连接信号
self.builder.connect_signals(self)
和
self.dialog1.connect('response', self.on_response)
然后它开始按设计工作(“不关闭对话框”按钮不会关闭对话框)。
但是在这种情况下,这两行不应该在功能上完全相同吗?有没有办法弄清楚这两种情况之间有什么不同?
我可以告诉信号在这两种情况下仍然是连接的,因为文本仍然从DummyDialog.on_response
. widget.emit_stop_by_name('response')
但是当我使用 GtkBuilder 时,该部分似乎停止工作。
更令人困惑的是,如果您使用这个确切的代码并在 PyGTK 上运行它(更改from gi.repository import Gtk
为import gtk as Gtk
),那么它在两种情况下都能正常工作(使用self.builder.connect_signals(self)
or self.dialog1.connect('response', self.on_response)
)。