Python Tkinter Canvas no puede enlazar el teclado

He estado ejecutando un pequeño script como este

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

Sin embargo, el evento de teclado no se maneja en mi situación (uso Python 2.7 en la ventana 7)

Si yo uso

 w.bind("", callback) 

Las cosas funcionan bien.

Entonces, esto realmente me desconcierta. Por favor, que alguien me diga por qué sucede esto, gracias de antemano.

Los enlaces de teclas solo se activan cuando el widget con el foco del teclado recibe un evento clave. El canvas por defecto no obtiene el foco del teclado. Puedes darle enfoque con el método focus_set . Normalmente harías esto en un enlace en el botón del mouse.

Agregue el siguiente enlace a su código, luego haga clic en el canvas y sus enlaces de teclas comenzarán a funcionar:

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

Para evitar el “clic en el canvas para activar los enlaces de teclas”, encontré un código más simple en el siguiente sitio:

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

Está intentando enlazar un marco, pero lo implementé en mi propio código y el widget de canvas también funciona. Su código se verá como el siguiente:

 w.focus_set() w.bind(, callback) 

Hay un evento útil en tkinter llamado “Enter”, que rastrea cuando el mouse ingresa a un widget. Si lo enlaza con el canvas, y en la callback del enlace para ese evento, canvas.focus_set, entonces siempre que el mouse esté en el canvas, tendrá enfoque, y así funcionarán los enlaces del teclado.

Esto funcionará incluso si el canvas pierde el enfoque (por ejemplo, al ingresar texto en otro widget), porque cuando el mouse ingresa nuevamente en el canvas, recuperará el enfoque.