2017-07-26 2 views
2

Ich erstellte Gtk.VBox Container mit numbox = Gtk.VBox(spacing = 10) Zeile und ich fügte zu viele Widgets und Schaltflächen Widgets in es. aber wenn ich einmal auf eine Schaltfläche klicken Widgets numbox.connect("button-press-event", print_widget_prop) Codezeile funktioniert nicht. aber wenn ich zwei oder drei mal auf irgendeinen Knopf klicke, funktioniert diese Codezeile. Warum, wenn ich auf Schaltflächen klicke, funktioniert diese Codezeile nicht?PyGtk3, Catching Einzelklick-Ereignis, wenn die Schaltfläche geklickt wird

Beispiel

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

Können Sie Ihren vollständigen Code veröffentlichen? Oder zumindest ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve)? – theGtknerd

+0

okey werde ich danke machen. – Nomad

+0

@theGtknerd, ich habe es getan. – Nomad

Antwort

1

Dies ist etwas, was ich noch nie zuvor gesehen hat. Allerdings ändert

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

zu

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

nicht für einzelne Klicks arbeiten (für mich jedenfalls).

+0

Danke, aber diese Antwort löst nicht genau mein Problem. Wenn es eine andere Lösung mit "Button-Press-Event" gibt, möchte ich es wissen. Aber wenn es keine andere Lösung gibt, muss ich diese Lösung verwenden. – Nomad

+0

können Sie mir Ihre E-Mail geben? Wir können von dort reden, weil Sie PyGtk3 gut kennen. Ich möchte mit dir über PyGtk3 sprechen und ein paar Fragen stellen. – Nomad

+0

@Nomad Können Sie erklären, warum Sie 'button-press-event' und nicht' button-release-event' brauchen? – theGtknerd

1

Als Ergänzung zu @theGtkNerd Antwort.

Dies kann ein Fehler sein. In der Tat, seine Antwort auf Ihre andere Frage, wo er schlägt vor, den Knopf in eine Gtk.EventBox zu wickeln und dann die Methode set_above_child zu verwenden, tut den Trick.

Wie auch immer, meine Ergänzung ist, dass Ihre Methode do_anything nicht vollständig ist. In der Tat müssen Sie Wahr oder Falsch zurück:

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

Dies geschieht, weil der button-press-event Rückruf einen Booleschen Wert zurück, um anzuzeigen, wenn das Signal an die übergeordneten Widgets propagieren sollte.

Wenn Sie beispielsweise einen Rückruf auf das Ereignis button-press-event setzen und dann true zurückgeben, erhalten Sie keine einzelnen, doppelten oder dritten Klickereignisse. Dies geschieht, weil von True Rückkehr es anzeigt, dass das Signal nicht weiter entlang es Eltern der bis zum Toplevel-Widget propagieren sollte:

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() 

Wenn Sie den obigen Code testen, werden Sie feststellen, dass die Ereignisse auf dem Schaltfläche wird nicht an die EventBox weitergegeben.

Was bedeutet das?

Nun, es scheint, dass die button-press-event für eine einzelne isolierte Presse nicht propagiert wird. Wenn Sie einen "Doppelklick" versuchen, wird es sich mit einer Anzahl von 2 fortpflanzen und drei aufeinander folgende Klicks werden auch das Signal weiterleiten.

Es scheint sich um einen Fehler zu handeln, aber es werden weitere Details benötigt, z. B. den gtk Quellcode zu graben, um den Grund zu finden.

+1

Vielen Dank. Ich dachte das. aber ich kann die Signale nicht mit zu vielen Buttons in der EventBox verbinden. aber das kann eine gute Lösung sein. – Nomad

Verwandte Themen