2016-05-21 14 views
2

Gibt es eine Möglichkeit, ein Click and Hold-Ereignis in PyGTK zu erkennen? Ich bin in einer Touch-Umgebung, und ich möchte ein Kontextmenü aus einer Schaltfläche öffnen, wenn ich die Taste länger als eine Sekunde gedrückt halte, da ich keinen Rechtsklick oder Ctrl-Klick ausführen kann.Klicken und halten in PyGTK?

Wenn es nicht einen einfachen Weg gibt, nehme ich an, ich könnte das Mausereignis veranlassen, ein GTK-Zeitlimit zu starten, das das Menü aktivieren würde, und es in der Mausfreigabehandhabung abbrechen. Aber wenn das Zeitlimit ausgelöst wird, wie würde ich das Drücken der Maus abbrechen, damit die Maus nicht ausgelöst wird?

+0

Muss die Lösung vom Betriebssystem unabhängig sein? Wenn nicht, auf welchem ​​Betriebssystem sind Sie? – bohrax

Antwort

0

Ich denke, die einfachste und portabelste Art wäre, Ihren Ansatz zusammen mit einem Status-Flag zu verwenden, das informiert, wenn ein "langer Klick" ausgeführt wird. Anstatt sich mit dem "angeklickt" -Signal der Schaltfläche zu verbinden, können Sie stattdessen 'freigegeben' verwenden und den Wert des Flags in diesem Handler überprüfen.

+0

Oh bugger. Unter Windows auf einem Touchscreen funktioniert das nicht. Wenn Sie eine Schaltfläche berühren, erhalten Sie kein "gedrückt" -Ereignis. Wenn Sie stattdessen berühren und loslassen, werden Sie in schneller Folge "gedrückt", "geklickt" und "losgelassen". Wenn Sie gedrückt halten, öffnet das OS eine Box, die darauf hinweist, dass die Freigabe ein Kontextmenü öffnet, und wenn Sie es freigeben, gibt PyGTK keines dieser drei Ereignisse aus. –

2

bohrax: Nach dem Versuch, und für eine Weile darauf zu schlagen, mutierte es in etwas ziemlich sauberes. Vielleicht kann jemand anderes es noch sauberer machen.

class HoldButton(gtk.Button): 

    __gsignals__ = { 'held' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,()) } 

    def __init__(self, label=None, stock=None, use_underline=True): 
     gtk.Button.__init__(self, label, stock, use_underline) 
     self.connect('pressed', HoldButton.h_pressed) 
     self.connect('clicked', HoldButton.h_clicked) 
     self.timeout_id = None 

    def h_clicked(self): 
     if self.timeout_id: 
      gobject.source_remove(self.timeout_id) 
      self.timeout_id = None 
     else: 
      self.stop_emission('clicked') 

    def h_pressed(self): 
     self.timeout_id = gobject.timeout_add(750, HoldButton.h_timeout, self) 

    def h_timeout(self): 
     self.timeout_id = None 
     self.emit('held') 
     return False 

Dies startet eine Zeitüberschreitung in der "gedrückt" Handler. Wenn es im "angeklickt" -Handler noch aussteht, wird die Zeitüberschreitung abgebrochen, andernfalls wird das "geklickte" Signal mit stop_emission beendet. Dann musste ich herausfinden, wie man ein neues Signal "held" definiert, das im Timeout-Handler ausgegeben wird.

+0

Ich mag, dass Sie es geschafft haben, das Verhalten einzukapseln. War vorher nicht über die stop_emission-Funktion informiert. – bohrax

+0

Hey, ich möchte das ganze Skript auf meinem Touchscreen (Debian) testen. Hast du das Skript in GitHub verfügbar? –