2017-07-26 71 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