2013-03-07 12 views
5

Ho corso un piccolo script come questoPython Tkinter Canvas non riescono a legare tastiera

from Tkinter import * 
root = Tk() 
def callback(event): 
    print "callback" 
w = Canvas(root, width=300, height=300) 
w.bind("<Key>", callback) 
w.pack() 
root.mainloop() 

Tuttavia, l'evento tastiera non viene gestito nella mia situazione (io uso Python 2.7 sulla finestra 7)

Se uso

w.bind("<Button-1>", callback) 

Le cose funzionano bene.

Quindi, questo mi imbarazza davvero. Per favore qualcuno mi dica perché questo sta accadendo, grazie in anticipo.

+0

controllare questo http://stackoverflow.com/questions/13326940/python-tkinter-how-to-bind-key-to-a-button – user19911303

risposta

6

Le associazioni di tasti si attivano solo quando il widget con lo stato attivo della tastiera riceve un evento chiave. L'area di disegno predefinita è non attiva la tastiera. Puoi concentrarti sul metodo focus_set. Normalmente lo farebbe in un binding sul pulsante del mouse.

Aggiungere il seguente vincolante per il codice, quindi fare clic nella tela e le vostre combinazioni di tasti inizieranno a lavorare:

w.bind("<1>", lambda event: w.focus_set()) 
+1

Grazie Bryan, è il problema di messa a fuoco. Anche se il codice è un po 'diverso. Lo faccio funzionare inline 'w.focus_set() w.bind ('', funzione)' –

+0

@RobertBean: solo per essere chiari - non devi fare il focus_set prima dei bind. Il focus_set deve essere fatto prima che la gente inizi a usare la tastiera. –

+0

Inoltre non capisco perché @BryanOakley sottolinea di associare un clic del mouse con w.focus_set(), invece di usare un inline w.focus_set(). – wsysuper

2

per evitare il "cliccando sulla tela per attivare le combinazioni di tasti", ho trovato più semplice il codice al seguente sito:

http://ubuntuforums.org/showthread.php?t=1378609

si sta tentando di associare un telaio, ma ho implementato nel mio codice e il widget di tela funziona pure. Il codice sarà simile al seguente:

w.focus_set() 
w.bind(<Key>, callback) 
1

C'è un evento utile in Tkinter chiamato "Enter", che tiene traccia quando il mouse entra un widget. Se lo si lega alla tela e nel richiamo della rilegatura per quell'evento è canvas.focus_set, quindi ogni volta che il mouse si trova sulla tela si avrà lo stato attivo, e quindi i binding della tastiera funzioneranno.

Ciò funzionerà anche se la tela perde la messa a fuoco (ad esempio inserendo il testo in un altro widget), perché quando il mouse immetterà di nuovo la tela, riacquisterà la messa a fuoco.

+1

Questa risposta sarebbe più completa con uno snippet di codice. –