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源代码来查找原因。
我用 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源代码来查找原因。