我想要一个对话框窗口,其中一些按钮关闭对话框,其他按钮则关闭。我这样做的方法是使用Gtk.Dialog
的response
信号在对话框上调用emit_stop_by_name('response')
。 (如果有人知道这样做的更好方法,那可能会抢占这个问题的其余部分。)使用GtkBuilder自动连接信号时对话框会中断,但在手动连接信号时工作
这个在我使用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
打印到CLI。但是,当我使用GtkBuilder时,似乎widget.emit_stop_by_name('response')
部分停止工作。
更令人费解的是,如果你把这个确切的代码和PyGTK的(变化from gi.repository import Gtk
到import gtk as Gtk
)运行它,然后它工作正常在这两种情况下(使用self.builder.connect_signals(self)
或self.dialog1.connect('response', self.on_response)
)。
谢谢,这似乎不只是手动信号连接不工作,这一直是我以前的解决方案更好的解决方案。但我仍然困惑,为什么我的原始代码不起作用。 – dumbmatter 2012-03-05 20:27:00