我使用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()
答案 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源代码以找到原因。