2009-09-20 41 views
9

Soy nuevo en Python y estoy tratando de crear una GUI simple usando Tkinter.Cambiar el foco de un widget de texto a otro

Por lo general, en muchas interfaces de usuario, presionar el botón de tabulación cambiará el enfoque de un widget de texto a otro. Siempre que estoy en un widget de Texto, la pestaña solo sangra el cursor de texto.

¿Alguien sabe si esto es configurable? De lo contrario, ¿puede el PyQt o cualquier otro marco de interfaz de usuario de Python ofrecer esta funcionalidad?

Respuesta

15

Esto es muy fácil de hacer con Tkinter.

Hay un par de cosas que tienen que suceder para que esto funcione. En primer lugar, debe asegurarse de que el comportamiento estándar no ocurra. Es decir, no desea que la pestaña inserte una pestaña y mueva el foco al siguiente widget. Por defecto, los eventos son procesados ​​por un widget específico antes de que ocurra el comportamiento estándar (generalmente en enlaces de clase). Tk tiene un mecanismo incorporado simple para detener eventos de procesamiento adicional.

En segundo lugar, debe asegurarse de enviar el foco al widget apropiado. Existe un soporte integrado para determinar cuál es el próximo widget.

Por ejemplo:

def focus_next_window(event): 
    event.widget.tk_focusNext().focus() 
    return("break") 

text_widget=Text(...) 
text_widget.bind("<Tab>", focus_next_window) 

puntos importantes acerca de este código:

  • El método tk_focusNext() devuelve el siguiente Widget en la jerarquía de recorrido de teclado.
  • el método focus() pone el foco en ese widget
  • que devuelve "break" es crítico, ya que evita que la vinculación de clases se active. Es este enlace de clase el que inserta el carácter de tabulación, que no desea.

Si desea este comportamiento para todos los widgets de texto en una aplicación que puede utilizar el método bind_class() en lugar de bind() de que sea vinculante afectar a todos los widgets de texto.

También puede hacer que el enlace se envíe a un widget muy específico, pero le recomiendo que se quede con el orden de recorrido predeterminado, luego asegúrese de que el orden transversal sea el correcto.

+1

Esa sugerencia de devolución ("break") me salvó el día, ¡gracias Bryan! – Symon

+0

Tuve una pregunta en gran parte no relacionada sobre cómo hacer algunos pasos adicionales en respuesta a un , ** sin ** realmente detener el de llevar a cabo su comportamiento predeterminado. Esta respuesta lo cubrió perfectamente. ¡Gracias! – JDM

-3

Debido a la naturaleza multiplataforma, el recorrido del enfoque es algo personalizable, por lo general, permite que el administrador de Windows X lo maneje (con el foco sigue al mouse o haga clic en). De acuerdo con the manual, debería ser posible bind un evento para el evento de pulsación de tecla, escaneo para presionar tabulaciones y desencadenar un evento focusNext en esos casos.

+0

que no entiendo eso; Sugerí exactamente qué http: // stackoverflow.com/users/7432/bryan-oakley escribió en su respuesta aceptada http://stackoverflow.com/questions/1450180/how-can-i-change-the-focus-from-one-text-box-to-another- in-python-tkinter/1451343 # 1451343 ¿no? – dlamblin

+0

Tu respuesta es demasiado débil para ser útil. No creo que sea cierto que el recorrido focal sea personalizable "debido a la naturaleza multiplataforma". Ser multiplataforma no tiene nada que ver con eso. Además, tu respuesta dice "debería ser posible". Si estoy buscando ayuda y alguien dice "debería ser posible", no creo que sea muy tranquilizador. O lo es o no lo es. Y, finalmente, "escanear prensas de pestañas" no tiene sentido: no hay forma de "[escanear] para presionar las pestañas" y no dice cómo hacerlo. Parece que tu respuesta es una suposición, lo que la hace menos útil. –

0

No estoy seguro acerca de TKinter, pero con PyQt, se puede conectar una función a la pestaña de cambio de señal emitida por el cuadro de pestañas (la señal también tiene un valor int). Pero por lo que yo sé, Qt es bastante bueno haciendo lo correcto sin que se especifique.

0

Es muy simple en PyQt4 simplemente utilizar esta única línea de abajo y usted será capaz de cambiar de enfoque pulsando el botón pestaña:

self.textEdit.setTabChangesFocus (Verdadero)

Cuestiones relacionadas