2017-07-26 63 views
2

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

例如

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

难道您发布完整的代码?或者至少一个[最小,完整和可验证的例子](https://stackoverflow.com/help/mcve)? – theGtknerd

+0

okey我会尽力感谢。 – Nomad

+0

@theGtknerd,我做到了。 – Nomad

回答

1

这件事之前,我从来没有见过。但是,改变

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

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

单点击不工作(我反正)。

+0

谢谢,但这个答案并不能解决我的问题。如果有另一种解决方案“按键事件”,我想知道它。但如果没有其他解决方案,我必须使用这个解决方案。 – Nomad

+0

你可以给我你的电子邮件吗?我们可以从那里谈谈,因为你知道PyGtk3。我想和你谈谈PyGtk3并提出一些问题。 – Nomad

+0

@Nomad你能解释一下为什么你需要'button-press-event'而不是'button-release-event'? – theGtknerd

1

为补充@theGtkNerd答案。

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

不管怎样,我的补充是,你的方法do_anything是不完整的。事实上,你需要返回真或假:

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

这是因为button-press-event回调函数返回一个布尔值,表示如果信号将传播到父控件。

作为示例,如果您将回调设置为btnbutton-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源代码找到原因。

+1

非常感谢。我想到了这一点。但我无法将信号连接到EventBox中太多的按钮。但这可以是很好的解决方案。 – Nomad