9 votes

Comment créer et utiliser des raccourcis clavier dans une application Gtk que je suis en train de développer ?

Je suis en train de créer une application pour l'Ubuntu App Showdown en Python + Gtk avec quickly. Je l'appelle Discvur. J'aurais aimé inclure quelques raccourcis clavier.

En cherchant sur le web, j'ai trouvé cette page sur AccelGroup et cette page sur gtk_widget_add_accelerator mais je ne comprends pas comment commencer avec cela. Pourriez-vous me dire comment je pourrais définir un signal approprié et ensuite l'utiliser dans mon application?

8voto

Jeroen Dierckx Points 394

Voici quelques morceaux de code provenant de l'une de mes applications Python + Gtk, plus étendus selon les commentaires de cette réponse :

self.my_accelerators = Gtk.AccelGroup()
self.entry = Gtk.builder.get_object("entry1")
self.add_accelerator(self.entry, "b", signal="backspace")
...

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Ajoute un raccourci clavier"""
    if accelerator est not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

6voto

SkunkSpinner Points 2683

Voici le code qui a finalement fonctionné. Comme cela dépend fortement de mon environnement de développement Quickly + Glade + Python + Gtk, j'en fais une réponse indépendante. La réponse de Bryce a beaucoup aidé, tout comme mes échanges avec aking1012.

Le code actuel, dans un éditeur de texte:

# Raccourcis
self.my_accelerators = Gtk.AccelGroup()
self.window = self.builder.get_object("discvur_window")
self.window.add_accel_group(self.my_accelerators)
self.entry = self.builder.get_object("entry1")
self.add_accelerator(self.entry, "b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Ajoute un raccourci clavier"""
    if accelerator is not None:
        #if DEBUG:
            #print accelerator, widget.get_tooltip_text()
        key, mod = Gtk.accelerator_parse(accelerator)
        widget.add_accelerator(signal, self.my_accelerators, key, mod, Gtk.AccelFlags.VISIBLE)
        print "Le raccourci a bien été ajouté avec le signal " + signal

def on_erasing(self, widget):
    print "Ça marche."

Dans Glade, j'ai créé un GtkEntry appelé "entry1" dans ma fenêtre appelée "discvur_window". Dans l'onglet 'Signaux', j'ai donné au signal "backspace" un gestionnaire appelé "on_erasing".

Maintenant, en appuyant sur Backspace ou Ctrl+B, le terminal affiche "Ça marche.".

2voto

ThorSummoner Points 2831

J'ai reconditionné les réponses données dans ce fil de discussion en un exemple autonome :

#!/usr/bin/env python2

import signal

from gi.repository import Gtk

def bind_accelerator(accelerators, widget, accelerator, signal='clicked'):
    key, mod = Gtk.accelerator_parse(accelerator)
    widget.add_accelerator(signal, accelerators, key, mod, Gtk.AccelFlags.VISIBLE)

def on_recompute_base_encryption_key_hash(widget):
    print 'Réflexion... (Cela pourrait prendre éternellement)'

def main():

    if 'gtk':
        window = Gtk.Window()
        window.connect("delete-event", Gtk.main_quit)

        if 'accelerator-demo':
            # Accélérateurs
            accelerators = Gtk.AccelGroup()
            window.add_accel_group(accelerators)

            # Widget
            target_widget = Gtk.Button('Recompute Base Encryption Key Hash')
            target_widget.connect('clicked', on_recompute_base_encryption_key_hash)
            window.add(target_widget)

            # Lier
            bind_accelerator(accelerators, target_widget, 'b')

        window.show_all()
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        Gtk.main()

if __name__ == '__main__':
    main()

Aussi disponible sous forme de gist : https://gist.github.com/thorsummoner/230bed5bbd3380bd5949

Note: Le signal par défaut est clicked, pas activate car Les applications ne devraient jamais se connecter au signal ::activate, mais utiliser le signal ::clicked de Gtk.Button.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X