gtk.ToolButton上Enter-Notify-Event信号无效

5 投票
2 回答
2157 浏览
提问于 2025-04-17 01:49

在一个开心的(虽然可能不太相关)话题上,这是我这个项目中最后一个障碍。如果我能解决这个问题,我就能发布我的第一个重要版本(1.0),而这个项目也将公开。感谢这里的每一个人,帮助我完成这个项目,还有我其他的两个项目(大家的回答都很有帮助,正如它们应该的那样)。

现在,回到实际的问题...

我在我的应用程序中有一个工具栏(使用Python 2.7和PyGTK),上面有几个gtk.ToolButton对象。这些按钮运行得很好,我已经为它们设置了“点击”事件。

不过,我还需要把它们连接到“enter-notify-event”和“leave-notify-event”信号,这样我就可以在状态栏中显示按钮的功能。

这是我写的代码。我没有收到任何错误,但状态栏的消息没有出现:

new_tb = gtk.ToolButton(gtk.STOCK_NEW)
toolbar.insert(new_tb, -1)
new_tb.show()
new_tb.connect("clicked", new_event)
new_tb.connect("enter-notify-event", status_push, "Create a new, empty project.")
new_tb.connect("leave-notify-event", status_pop)

我知道问题不在于“status_push”和“status_pop”事件,因为我已经把所有的gtk.MenuItem对象都连接到这些事件上,它们运行得很好。

我知道gtk.ToolButton对象属于Widgets类,所以“enter-notify-event”和“leave-notify-event”理论上应该可以工作。我唯一的猜测是,这个特定的对象除了“clicked”之外不发出其他信号,因此我可能需要把每个按钮放在一个gtk.EventBox里。

我在这里做错了什么?我该如何解决这个问题?

提前谢谢大家!

2 个回答

5

你的猜测是对的,你应该把你的组件放在一个叫做 gtk.EventBox 的东西里。下面有个例子,希望对你有帮助:

import gtk


def callback(widget, event, data):
    print event, data


class Win(gtk.Window):

    def __init__(self):
        super(Win, self).__init__()
        self.connect("destroy", gtk.main_quit)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_default_size(250, 200)

        tb = gtk.ToolButton(gtk.STOCK_NEW)
        # Wrap ``gtk.ToolButton`` in an ``gtk.EventBox``.
        ev_box = gtk.EventBox()
        ev_box.connect("enter-notify-event", callback, "enter")
        ev_box.connect("leave-notify-event", callback, "leave")
        ev_box.add(tb)

        self.add(ev_box)


if __name__ == '__main__':
    Win()
    gtk.main()
2

根据实验和证据来看,这在PyGtk 2.24中是做不到的。

撰写回答