KEY.is_pressed () in gi.repository.Gdk?

4

Mi stavo chiedendo se qualcuno sapesse come rilevare se un tasto è attualmente premuto con Gtk o Gdk e Python? Non voglio utilizzare l'evento premuto per tasto o rilasciato per questo scenario, ma piuttosto controlla se è attualmente premuto all'avvio dell'applicazione.

In particolare, ecco cosa vorrei che la mia applicazione facesse:

  1. Inizia l'apertura con la scorciatoia da tastiera.
  2. Attendi 2 secondi.
  3. Se la scorciatoia da tastiera viene ancora mantenuta dopo 2 secondi, mostra la finestra.
  4. Se, in qualsiasi momento durante il timer di 2 secondi, la scelta rapida da tastiera è stata rilasciata, non mostrare la finestra ed uscire.

Questo è simile alla funzionalità vista in Unity Keyboard Shortcut Overlay, dove si tiene premuto il tasto SUPER per 2 secondi e viene visualizzata la finestra. Se c'è un modo migliore per farlo (preferibilmente senza il programma in esecuzione in background e in attesa), sarebbe accettabile.

Sperando per il meglio,

Sean

    
posta Sean Davis 05.05.2012 - 14:14

2 risposte

2

Supponendo che tu stia parlando di un pulsante ordinario (come supposto per un pulsante di attivazione) puoi vedere tutto il metodi che ha qui . Mentre lo leggo non sembra esserci una funzione per ciò che stai cercando, probabilmente perché queste cose sono progettate per essere guidate dagli eventi.

In ogni caso, mi chiedo, non puoi semplicemente ottenere gli eventi per impostare un booleano e dare un'occhiata a questo per vedere se è premuto. Altrimenti, forse puoi spiegare la logica del perché è importante per te andare in giro per gli eventi.

Modifica

Dopo aver capito di aver letto male il post originale e di parlare dei tasti della tastiera e non dei pulsanti, ho trovato il seguente suggerimento.

Quando il programma viene eseguito, crea una finestra gtk e la nasconde, per consentire di ascoltare gli eventi della tastiera. Quindi ascolterà gli eventi chiave rilasciati da qualsiasi tasto presente nel collegamento che ha avviato il programma (in questo caso ctrl-alt-u). Se una di queste chiavi viene rilasciata, entro il timeout di avvio, si chiuderà alla fine del timeout, altrimenti mostrerà il programma.

Se vuoi ritardare l'effettivo inizio del codice del tuo programma per risparmiare risorse, puoi ovviamente utilizzare solo una finta finestra e non caricare prima la vera finestra o una delle classi sottostanti nella funzione start_or_not .

import pygtk
pygtk.require('2.0')
import gtk

class DelayedStart:

    def __init__(self):
        self.w = gtk.Window()
        self.w.connect('destroy', gtk.main_quit)
        # Connect key released events to a function
        self.w.connect('key_release_event', self.on_key_press_event)
        self.w.show_all()
        # Hide the window, we actually need a gtk window to listen for
        # keyboard events, so we just hide it
        self.w.set_decorated(False)
        self.w.set_opacity(0)

        self.show_on_timeout = True
        # Ask gtk to call the this function in 2 seconds
        gtk.timeout_add(1000*2, self.start_or_not)
        gtk.main()

    def on_key_press_event(self, widget, event):
        """ Check if any of the key in the shortcut ctrl-alt-u is released """
        # ctrl = 65507, alt = 65513, u = 117
        keys = [65507, 65513, 117]
        if event.keyval in keys:
            self.show_on_timeout = False

    def start_or_not(self):
        """ Check if the program should be started or not """
        if self.show_on_timeout:
            self.w.set_decorated(True)
            self.w.set_opacity(1)
        else:
            gtk.main_quit()
        # Returning false will destroy the timer, we only want to run this once
        return False

if __name__ == "__main__":
    DELAYED_START = DelayedStart()
    
risposta data TLE 17.05.2012 - 11:55
0

Aggiungerò solo una nota qui; Ho appena saputo della libreria keybinder , che apparentemente è divisa dalle note di Tomboy (sebbene sia Gtk2 e ho appena visto l'etichetta Gtk3):

  • link

Viene compilato da C come libreria di oggetti condivisa .so , e ha un'interfaccia Python:

python -c 'import pprint,inspect,keybinder; pprint.pprint(inspect.getmembers(keybinder))' | less

Guarda la fonte in keybinder / libkeybinder su master · engla / keybinder · GitHub ; Riesco a vedere che anche a livello C, l'implementazione consiste nell'accedere agli eventi keypress e non c'è nulla (a mio avviso) in grado di contenere lo stato premuto dei tasti della tastiera. Il che probabilmente significa che, sfortunatamente, non esiste una funzione (funzione, array) per cercare uno stato premuto di un tasto (ny) in qualsiasi momento.

    
risposta data sdaau 08.04.2013 - 17:16

Leggi altre domande sui tag