使用GtkBuilder自动连接信号时对话框中断,但在手动连接信号时有效

时间:2012-01-30 03:26:35

标签: python gtk pygtk pygobject gtkbuilder

我想要一个对话框窗口,其中某些按钮关闭对话框而其他按钮则不关闭。我这样做的方法是使用response的{​​{1}}信号在对话框中调用Gtk.Dialog。 (如果有人知道这样做的更好方法,那可能会抢占这个问题的其余部分。)

这在我使用PyGTK时起作用了。我现在正在转向PyGObject ..如果我手动连接到响应信号而不是使用emit_stop_by_name('response'),似乎这种技术只能

但是不要相信我的话。这是我的问题的一个最小例子:

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) 打印到CLI。但是当我使用GtkBuilder时,似乎DummyDialog.on_response部分停止工作。

更令人困惑的是,如果您使用此确切代码并在PyGTK上运行(将widget.emit_stop_by_name('response')更改为from gi.repository import Gtk),那么它在两种情况下都能正常运行(使用import gtk as Gtk或{ {1}})。

1 个答案:

答案 0 :(得分:2)

我会做的有点不同。删除按下单击的回调中的dialog1.destroy()并将on_response回调更改为:

    def on_response(self, widget, response, data=None):
        print 'response:', response
        if response < 0:
            self.dialog1.destroy()