我在這裏使用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。
這不會幫助:孩子將自動在事件盒上面默認添加。我其實曾經嘗試過。 – Pouria 2013-03-07 18:25:51
嗯,你是對的,這是默認的。對不起 – iain 2013-03-07 20:21:19
沒問題。不管怎麼說,還是要謝謝你! – Pouria 2013-03-08 17:28:43