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

时间:2017-07-26 18:32:52

标签: python gtk3

我使用Gtk.VBox行创建了numbox = Gtk.VBox(spacing = 10)容器,并在其中添加了太多小部件和按钮小部件。但是当我在任何按钮小部件上单击一次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()

2 个答案:

答案 0 :(得分:1)

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

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

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

适用于单击(无论如何对我而言)。

答案 1 :(得分:1)

作为@theGtkNerd答案的补充。

这可能是个错误。事实上,他对你的另一个问题的答案,他建议将按钮包装在Gtk.EventBox中,然后使用方法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回调返回一个布尔值来指示信号是否应该传播到父窗口小部件。

例如,如果您将回调设置为btn button-press-event事件然后返回true,则您将无法收到任何单击,双击或第三次点击事件。发生这种情况是因为返回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没有被传播。如果您尝试"双击"它会以2的计数传播,连续三次点击也会传播信号。

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