2013-03-07 14 views
1

我在這裏使用python和PyGObjects(自檢庫)爲Gtk 3。Gtk3:動態添加和刪除EventBox按鈕:按鈕將不會收到鼠標按下信號

考慮下面的代碼:

from gi.repository import Gtk 

class InternalWidget(Gtk.Button): 
    def __init__(self): 
     super(InternalWidget, self).__init__() 
     self.set_size_request(100,100) 
     self.connect("button-press-event", self.on_press) 

    def on_press(self, *args): 
     print "The Internal Widget was clicked." 


class ExternalEventBox(Gtk.EventBox): 
    def __init__(self): 
     super(ExternalEventBox, self).__init__() 
     self.fixed = Gtk.Fixed() 
     self.add(self.fixed) 
     self.internal_widget = InternalWidget() 
     self.set_size_request(200, 200) 
     self.connect("button-press-event", self.on_press) 
     self.connect("enter-notify-event", self.on_enter) 
     self.connect("leave-notify-event", self.on_leave) 

    def on_enter(self, *args): 
     self.fixed.put(self.internal_widget, 50,50) 
     self.show_all() 

    def on_leave(self, *args): 
     self.fixed.remove(self.internal_widget) 

    def on_press(self,*args): 
     print "The External Event Box was clicked." 

w = Gtk.Window(Gtk.WindowType.TOPLEVEL) 
w.connect("delete-event", Gtk.main_quit) 
w.add(ExternalEventBox()) 
w.show_all() 
Gtk.main() 

以上,每當鼠標進入ExternalEventBox,按鈕(InternalWidget)加入到它作爲孩子。當鼠標離開ExternalEventBox時,該按鈕將作爲ExternalEventBox的子項被刪除。

現在,如果你運行的代碼(你可以),該按鈕出現並正常消失。然而,與預期相反,單擊該按鈕僅向包含ExternalEventBox的信號發送信號,而按鈕不接收信號。

有趣的是,預期的行爲(點擊按鈕實際點擊它)發生在該按鈕,而不是被動態地添加和刪除,在事件盒的構造函數添加一次,永遠不會被刪除。

這是一個錯誤,還是我只是錯過了什麼?

編輯:簡單地說,我只得到「外部事件盒被點擊了。」,但從來沒有「內部控件被點擊了。」。我提起了bug report

回答

0

您需要設置事件盒事件窗口是它下面的孩子使用.set_above_child(假)

這裏的文檔吧:GtkEventBox

如果窗口上方,裏面的所有事件事件框將進入事件框。如果窗口在下面,子窗口小部件的窗口中的事件將首先到達該窗口小部件,然後到達其父母。

+0

這不會幫助:孩子將自動在事件盒上面默認添加。我其實曾經嘗試過。 – Pouria 2013-03-07 18:25:51

+0

嗯,你是對的,這是默認的。對不起 – iain 2013-03-07 20:21:19

+0

沒問題。不管怎麼說,還是要謝謝你! – Pouria 2013-03-08 17:28:43