2012-01-30 49 views
6

我想要一个对话框窗口,其中一些按钮关闭对话框,其他按钮则关闭。我这样做的方法是使用Gtk.Dialogresponse信号在对话框上调用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 Gtkimport gtk as Gtk)运行它,然后它工作正常在这两种情况下(使用self.builder.connect_signals(self)self.dialog1.connect('response', self.on_response))。

回答

2

我会做一点不同。删除的按钮,点击dialog1.destroy()回调,改变on_response回调:

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

谢谢,这似乎不只是手动信号连接不工作,这一直是我以前的解决方案更好的解决方案。但我仍然困惑,为什么我的原始代码不起作用。 – dumbmatter 2012-03-05 20:27:00