3

pygtk リファレンスでは、すべてGtk.Widgetにイベントenter-event-notifyがあると記載されていますが、私のテスト コードでは、Label ウィジェットに対してイベントが発生することはありません (他の場合は動作しました)。

何か違うことをしなければならないことはありますか?

import pygtk
pygtk.require('2.0')
import gtk

class LabelTest:

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, widget, data=None):
        gtk.main_quit()

    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)

        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(10)

        self.label = gtk.Label("A label")

        # question section
        def labelMouseOver(w, data=None):
          print "mouse over"

        self.label.connect('enter-notify-event', labelMouseOver, None)
        # /question section

        self.window.add(self.label)
        self.label.show()
        self.window.show()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    test = LabelTest()
    test.main()
4

2 に答える 2

9

パフォーマンス上の理由から、独自の X ウィンドウを所有しない特定のウィジェットがあります。これは、ほとんどが装飾的であり、一般に X イベント シグナルを処理する必要がないためです。ここで完全なリストを見つけることができます。

そのような場合、GtkEventBoxでウィンドウレスウィジェットをラップすることをお勧めします (EventBox は具体的にその目的で構築されました)。

于 2013-01-13T03:35:26.037 に答える
2

OK私は解決策を持っています、それはここと同じです:Enter-Notify-EventSignalがgtk.ToolButtonで機能していません。いくつかの非自明な理由により、一部のウィジェットはそれ自体では信号に応答できず、それらの周りに追加のボックスが必要です。コード例を、私が行った方法で書き直しました。つまり、より新しいGTK 3.0のインポートと、から派生したよりオブジェクト指向のスタイルを使用しGtk.Windowます。また、ネストされたメソッドではなく、インスタンスメソッドを好む場合もあります。

from gi.repository import Gtk

class Foo (Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("destroy", Gtk.main_quit)
        self.set_border_width(50)
        box = Gtk.EventBox()
        label = Gtk.Label("Test")   
        box.add(label)
        box.connect("enter-notify-event", self.on_mouse)
        self.add(box)
        self.show_all()

    def on_mouse(self, widget, data=None):
        print widget, data

    def main(self):
        Gtk.main()

if __name__ == "__main__":
    Foo().main()
于 2013-01-13T00:04:29.790 に答える