web-dev-qa-db-fra.com

Comment créer et utiliser des raccourcis clavier dans une application Gtk que je développe?

Je crée rapidement une application pour Ubuntu App Showdown dans Python + Gtk. Je l'appelle Discvur. J'aurais aimé inclure des 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. Pourriez-vous me dire comment je définirais un signal approprié, puis je l'utiliserais dans mon application?

8
Agmenor

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 m'a beaucoup aidé, de même que mes échanges avec aking1012 .

Le code actuel, dans un éditeur de texte:

# Accelerators
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, "<Control>b", signal="backspace")

…

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    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 "The accelerator is well added with the signal " + signal

def on_erasing(self, widget):
    print "It works."

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

Maintenant, frapper Backspace ou Ctrl+B rend le terminal imprimer "Cela fonctionne.".

6
Agmenor

Voici quelques bouts de code de l'une de mes Python + Gtk apps, étendues selon les commentaires de cette réponse:

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

def add_accelerator(self, widget, accelerator, signal="activate"):
    """Adds a keyboard shortcut"""
    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)
8
Bryce

J'ai reconditionné les réponses données dans ce fil dans 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 'Thinking... (This could take forever)'

def main():

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

        if 'accelerator-demo':
            # Accelerators
            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)

            # Bind
            bind_accelerator(accelerators, target_widget, '<Control>b')

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

if __== '__main__':
    main()

Egalement disponible en tant que Gist: https://Gist.github.com/thorsummoner/230bed5bbd3380bd5949

Remarque: Le signal par défaut est clicked, et non activate car les applications ne doivent jamais se connecter au ::activate signal, mais utilisez le signal Gtk.Button ::clicked.

2
ThorSummoner