ここでは、Gtk 3 に python と PyGObjects (イントロスペクション ライブラリ) を使用しています。
次のコードを検討してください。
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
、ボタンは信号を受信しません。
興味深いことに、ボタンが動的に追加および削除されるのではなく、イベント ボックスのコンストラクターに一度追加され、決して削除されない場合に、予期される動作 (ボタンをクリックすると実際にクリックされる) が発生します。
これはバグですか、それとも何か足りないだけですか?
編集: 一言で言えば、「外部イベント ボックスがクリックされました」のみが表示されますが、「内部ウィジェットがクリックされました」は表示されません。
更新:バグ レポートを提出しました。