2017-07-26 2 views
2

numbox = Gtk.VBox(spacing = 10)の行を持つGtk.VBoxコンテナを作成しましたが、ウィジェットとボタンウィジェットをあまりにも多く追加しました。しかし、いずれかのボタンウィジェットで1回クリックすると、numbox.connect("button-press-event", print_widget_prop)コード行が機能しません。いずれかのボタンで2〜3回クリックすると、このコード行が機能します。なぜ私はボタンをクリックするだけで、このコード行は機能しませんか?PyGtk3、ボタンを1回クリックしたときのシングルクリックイベントの受け取り

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

私は感謝します。 – Nomad

+0

@theGtknerd、私はそれをやった。 – Nomad

答えて

1

これは私が前に見たことがないものです。しかし、(とにかく私のために)シングルクリックのために働くん

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

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

を変更します。

+0

ありがとう、しかし、この答えは私の問題を正確に解決しません。 「ボタンプレスイベント」のある別の解決策がある場合、私はそれを知りたいです。しかし、別のソリューションがない場合、私はあなたのソリューションを使用する必要があります。 – Nomad

+0

あなたは私にあなたの電子メールを送ることができますか?あなたはPyGtk3をよく知っているので、そこから話すことができます。私はPyGtk3についてあなたと話をし、いくつかの質問をしたいと思います。 – Nomad

+0

@Nomad 'button-press-event'ではなく' button-press-event'が必要な理由を説明できますか? – theGtknerd

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コールバックは信号が親ウィジェットに伝播すべきかどうかを示すブール値を返しますので、これが起こります。

たとえば、コールバックをbtnbutton-press-eventイベントに設定してtrueを返すと、1回、2回または3回のクリックイベントは発生しません。 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のカウントで伝播し、3回の連続したクリックも信号を伝播します。

これはバグだと思われますが、理由を見つけるためにgtkのソースコードを掘るなどの詳細が必要です。

+1

ありがとうver。私はこれを考えました。 EventBoxのボタンに信号を接続することはできません。しかし、これは良い解決策になる可能性があります。 – Nomad

関連する問題