PyGtk3,在单击按钮时捕捉单击事件

2024-06-08 20:27:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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()

Tags: 代码eventaddgtk部件connectbutton按钮
2条回答

作为对gtknerd答案的补充。在

这可能是个bug。事实上,他对你的另一个问题的回答是他建议把按钮包装在Gtk.事件框然后使用方法set_above_child来完成这个任务。在

总之,我的补充是您的方法do_anything不完整。实际上,您需要返回True或False:

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

发生这种情况是因为button-press-event回调返回一个布尔值来指示信号是否应该传播到父窗口小部件。在

例如,如果将回调设置为btnbutton-press-event事件,然后返回true,则不会收到任何单次、双击或第三次单击事件。发生这种情况是因为如果返回True,则表明信号不应沿着其父对象进一步传播,直到顶层小部件:

^{pr2}$

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

这是什么意思?在

好吧,一个单独的媒体的button-press-event似乎没有被传播。如果您尝试“双击”,它将传播计数为2,并且连续三次单击也将传播信号。在

这似乎是一个错误,但需要更多的细节,例如,挖掘gtk源代码以找到原因。在

这是我从未见过的东西。然而,改变

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

^{pr2}$

对单次点击有效(不管怎样对我来说)。在

相关问题 更多 >