Como eu crio e uso atalhos de teclado em um aplicativo Gtk que estou desenvolvendo?

8

Estou criando um aplicativo para o Ubuntu App Showdown em Python + Gtk com rapidez. Eu estou chamando isso de Discvur. Eu gostaria de incluir alguns atalhos de teclado.

Pesquisando na web, achei esta página sobre o AccelGroup e esta página sobre gtk_widget_add_accelerator , mas não entendo como começar com isso. Você poderia me dizer como definir um sinal apropriado e depois usá-lo na minha aplicação?

    
por Agmenor 20.06.2012 / 12:06

3 respostas

6

Aqui está o código que finalmente funcionou. Como depende muito do meu ambiente de desenvolvimento Rapidamente + Glade + Python + Gtk, eu faço uma resposta independente. A resposta do Bryce ajudou muito, e também as minhas trocas com o aking1012 .

O código atual, em um editor de texto:

# 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."

No Glade, eu criei um GtkEntry chamado "entry1" na minha janela chamado "discvur_window". Em Na aba 'Signals', eu dei o sinal "backspace" a um manipulador chamado "on_erasing".

Agora, pressionar Backspace ou Ctrl + B faz com que o terminal imprima "Funciona".

    
por Agmenor 05.07.2012 / 23:24
8

Aqui estão alguns trechos de código de um dos meus aplicativos Python + Gtk, estendidos ainda mais de acordo com os comentários para esta resposta:

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)
    
por Bryce 20.06.2012 / 12:11
2

Reempacotou as respostas fornecidas neste segmento em um exemplo independente:

#!/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 __name__ == '__main__':
    main()

Also available as a gist: https://gist.github.com/thorsummoner/230bed5bbd3380bd5949

Observação: o sinal padrão é clicked , não activate porque As aplicações nunca devem se conectar ao sinal ::activate , mas use o sinal Gtk.Button ::clicked .

    
por ThorSummoner 18.01.2016 / 20:56