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?
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.".
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)
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
.