Come faccio a creare e utilizzare le scorciatoie da tastiera in un'app Gtk che sto sviluppando?


9

Sto creando rapidamente un'applicazione per Ubuntu App Showdown in Python + Gtk. Lo sto chiamando Discvur. Mi sarebbe piaciuto includere alcune scorciatoie da tastiera.

Cercando sul web, ho trovato questa pagina su AccelGroup e questa pagina su gtk_widget_add_accelerator ma non capisco come iniziare da esso. Potresti dirmi come definirei un segnale appropriato e quindi utilizzarlo nella mia applicazione?


Il primo collegamento è interrotto ...
WinEunuuchs2Unix

Risposte:


8

Ecco alcune parti di codice di una delle mie app Python + Gtk, ulteriormente ampliate in base ai commenti a questa risposta:

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)

Grazie, ma ho ottenuto questo errore: self.add_accelerator(self.quick_add_entry, "<Control>l", signal="grab-focus") AttributeError: 'DiscvurWindow' object has no attribute 'quick_add_entry'. Quando provo una ricerca web di "quick_add_entry", non riesco a trovarla da nessuna parte. Sei sicuro che sia la funzione giusta? Dove posso trovare maggiori informazioni / un tutorial per questo? Inoltre, "<Control> l" significa Ctrl + l o è un errore di battitura?
Agmenor,

Non è una funzione, è solo il nome di qualsiasi widget a cui stai collegando l'acceleratore. L'ho rivisto per essere più chiaro.
Bryce,

La ringrazio per la risposta. Innanzitutto, mi sono preso la libertà di cambiare "GTK" in "GTK". Secondo, quando eseguo il tuo codice ottengo "NameError: il nome globale 'DEBUG' non è definito", quindi suppongo che questa sia una variabile dal tuo stesso script. Quindi l'ho commentato nella mia sceneggiatura. In terzo luogo, dopo averlo commentato, viene visualizzato l'errore "AttributeError: l'oggetto" DiscvurWindow "non ha attributo" acceleratori "". Mi dispiace se questo dovrebbe essere evidente, ma la documentazione è ancora oscura per me; in particolare la documentazione dice che add_accelerator necessita di 6 argomenti?
Agmenor,

Bene, devi creare tu stesso gli acceleratori; Ho aggiornato l'esempio per mostrare come.
Bryce,

Dopo un po 'di ricerche e tentativi falliti, ho potuto ottenere una sceneggiatura funzionante. Potresti verificarlo, per favore? Se ritieni che sia corretto, modificherò (o potrai) la tua risposta: paste.ubuntu.com/1053516 . Apprezzerei molto la tua recensione, Bryce. "Una piccola ricerca" è stato un eufemismo, ma suppongo che sia meglio imparare un uomo a pescare piuttosto che dargli pesce. Quindi grazie ancora.
Agmenor,

6

Ecco il codice che finalmente ha funzionato. Dato che dipende fortemente dal mio ambiente di sviluppo Quickly + Glade + Python + Gtk, lo faccio come una risposta indipendente. La risposta di Bryce ha aiutato molto, così come i miei scambi con aking1012 .

Il codice attuale, in un editor di testo:

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

In Glade, ho creato un GtkEntry chiamato "entry1" nella mia finestra chiamato "discvur_window". Nella scheda "Segnali", ho dato al segnale "backspace" un gestore chiamato "on_erasing".

Ora, premendo Backspaceo Ctrl+ B, il terminale stampa "Funziona".


Può essere usato per disabilitare la scorciatoia Ctrl + F4 per chiudere la finestra?
Juzer Ali,

Intendi Alt + F4? Non lo so, non ci ho provato.
Agmenor,

Intendevo Ctrl + F4 e Alt + F4
Juzer Ali

2

Ho riconfezionato le risposte fornite in questo thread in un esempio autonomo:

#!/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()

Disponibile anche come sintesi: https://gist.github.com/thorsummoner/230bed5bbd3380bd5949

Nota: il segnale predefinito è clicked, non activateperché le applicazioni non dovrebbero mai connettersi al ::activatesegnale, ma utilizzare il ::clickedsegnale Gtk.Button .


Così ho notato; quando si utilizza clickedl'acceleratore può essere schiacciato molto rapidamente, ma il pulsante non preme visivamente. Durante l'utilizzo activate, il pulsante verrà premuto, ma l'acceleratore può essere premuto solo una volta terminato il visual depress.
ThorSummoner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.