PyGtk3,单击按钮时捕获单击事件

PyGtk3, Catching single click event when button is single clicked

我用 numbox = Gtk.VBox(spacing = 10) 行创建了 Gtk.VBox 容器,并在其中添加了太多的小部件和按钮小部件。但是当我在任何按钮小部件上单击一次时 numbox.connect("button-press-event", print_widget_prop) 代码行不起作用。但是当我在任何按钮上单击两三次时,此代码行有效。为什么当我单击按钮时,此代码行不起作用?

例子

from Gtk3Modules import * # this code line imports Gtk, Gdk, ... module

def do_anything(wid, event):
    print("clicked", event.get_click_count()[1], "times")


w = Gtk.Window(title="_Simple_Window_")
w.connect("delete-event", Gtk.main_quit)

evbox = Gtk.EventBox()
evbox.connect("button-press-event", do_anything)
w.add(evbox)

vb = Gtk.VBox()
evbox.add(vb)

lb = Gtk.Label("I am a label")
vb.add(lb)

btn = Gtk.Button("I am a button\nWhen You Single Click me do_anything function not work !")
vb.add(btn)

w.show_all()

Gtk.main()

这是我以前从未见过的。然而,改变

evbox.connect("button-press-event", do_anything)

evbox.connect("button-release-event", do_anything)

确实适用于单击(无论如何对我来说)。

作为@theGtkNerd 回答的补充。

这可能是一个错误。事实上,他对你的另一个问题的回答是他建议将按钮包装在 Gtk.EventBox 中,然后使用方法 set_above_child 就可以了。

总之,我的补充是你的方法do_anything不完整。事实上你需要 return True or False:

def do_anything(wid, event):
    print("clicked", event.get_click_count()[1], "times")
    return False

发生这种情况是因为 button-press-event 回调 return 是一个布尔值,用于指示信号是否应传播到父控件。

例如,如果您将回调设置为 btn button-press-event 事件然后 return 为真,您将不会收到任何单击、双击或第三次单击事件。发生这种情况是因为通过 returning True 它将指示信号不应该沿着它的父级进一步传播,直到顶层小部件:

from gi.repository import Gtk, Gdk # this code line imports Gtk, Gdk, ... module

def do_anything(wid, event):
    print "clicked ", event.get_click_count()[1], "times"
    return False
def do_button(wid, event):
    print "button clicked"
    return True 

w = Gtk.Window(title="_Simple_Window_")
w.connect("delete-event", Gtk.main_quit)

evbox = Gtk.EventBox()
evbox.connect("button-press-event", do_anything)
w.add(evbox)

vb = Gtk.VBox()
evbox.add(vb)

lb = Gtk.Label("I am a label")
vb.add(lb)

btn = Gtk.Button("I am a button\nWhen You Single Click me do_anything function not work !")
btn.connect("button-press-event", do_button)
vb.add(btn)

w.show_all()

#Gdk.set_show_events (True)

Gtk.main()

如果您测试上面的代码,您会发现按钮上的事件不会传播到 EventBox。

这是什么意思?

好吧,看来 button-press-event 一个孤立的媒体没有被传播。如果您尝试 "double click",它将以 2 的计数传播,连续点击 3 次也会传播信号。

好像是个bug,但还需要更多的细节,例如,挖掘gtk源代码来查找原因。