web-dev-qa-db-fra.com

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

Je me demandais si quelqu'un savait comment détecter si une touche est actuellement enfoncée avec Gtk ou Gdk et python? Je ne souhaite pas utiliser l'événement à clé ou libéré pour ce scénario, mais plutôt vérifier s'il est actuellement activé au démarrage de l'application.

Plus précisément, voici ce que j'aimerais que ma demande fasse:

  1. Commencez l'ouverture par un raccourci clavier.
  2. Attendez 2 secondes.
  3. Si le raccourci clavier est toujours maintenu après 2 secondes, affichez la fenêtre.
  4. Si, à un moment quelconque du minuteur de 2 secondes, le raccourci clavier a été relâché, n’affiche pas la fenêtre et quitte.

Cette fonctionnalité est similaire à celle décrite dans l’incrustation des raccourcis clavier Unity, dans laquelle vous maintenez la touche SUPER enfoncée pendant 2 secondes et la fenêtre s’affiche. S'il existe un meilleur moyen de le faire (de préférence sans programme en attente et en arrière-plan), cela serait également acceptable.

Espérer le meilleur,

Sean

4
Sean Davis

En supposant que vous parlez d'un bouton ordinaire (comme supposé d'un bouton bascule), vous pouvez voir toutes les méthodes dont il dispose ici . D'après ce que j'ai lu, il ne semble pas y avoir de fonction pour ce que vous recherchez, probablement parce que ces éléments sont conçus pour être pilotés par les événements.

Quoi qu'il en soit, je me demande si vous ne pouvez pas obtenir que les événements définissent un booléen et jetez-y un coup d'œil pour voir s'il est activé. Sinon, vous pourriez peut-être expliquer pourquoi il est important pour vous de faire le tour des événements.

MODIFIER

Après avoir réalisé que je vous avais mal interprété votre message original et que vous parliez de touches du clavier et non de boutons, j'ai proposé la suggestion suivante.

Lorsque le programme est exécuté, il créera une fenêtre gtk et la masquera afin de permettre l'écoute des événements de clavier. Ensuite, il écoutera les événements de clé publiés parmi les touches du raccourci qui a démarré le programme (dans ce cas, ctrl-alt-u) . Si l'une de ces clés est relâchée, elle se ferme à l'expiration du délai de démarrage, sinon le programme sera affiché.

Si vous souhaitez retarder le démarrage réel de votre code de programme pour économiser des ressources, vous pouvez bien sûr simplement utiliser une fenêtre fictive et ne pas charger la fenêtre réelle ou les classes sous-jacentes auparavant dans la fonction 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 __== "__main__":
    DELAYED_START = DelayedStart()
2
TLE

Je vais juste ajouter une note ici; Je viens d'apprendre que la librairie keybinder, qui est apparemment séparée des notes de Tomboy (bien qu'il s'agisse de Gtk2 et que je viens de voir l'étiquette Gtk3):

Il est compilé à partir de C en tant que bibliothèque d'objets partagés .so, et possède une interface Python:

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

Regardez la source dans keybinder/libkeybinder sur master · engla/keybinder · GitHub ; Je peux voir que même au niveau C, la mise en œuvre se fait par le biais de l'inscription à des événements de pression de touche - et il n'y a rien (apparent pour moi) qui bloque l'état réellement enfoncé des touches du clavier. Ce qui signifie probablement que, malheureusement, il n’ya pas de fonction (fonction, tableau) permettant de rechercher un état pressé de la touche a(ny) à tout moment.

0
sdaau