La ventana de Tkinter se centra en Mac OS X

Estoy escribiendo una aplicación en Python con el marco de GUI de Tkinter. Escucha los eventos del teclado y el mouse, por lo que debe tener foco. Cuando se inicia desde un terminal en Ubuntu, el siguiente código funciona:

from Tkinter import * root = Tk() root.focus_force() def key(event): print "pressed", event.char def callback(event): print "clicked at", event.x, event.y frame = Frame(root, width=100, height=100) frame.bind("", key) frame.bind("", callback) frame.pack() frame.focus_force() root.mainloop() 

Sin embargo, cuando se inicia desde un terminal en Mac OS X 10.8.4 (stock de Python 2.7.2), el emulador de terminal retiene el enfoque hasta que el usuario hace clic en la ventana. ¿Alguien sabe de una solución para esto?

Intenté esto y funcionó bien para mí:

 from os import system from platform import system as platform # set up your Tk Frame and whatnot here... if platform() == 'Darwin': # How Mac OS X is identified by Python system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 

Por supuesto, eso traerá toda su aplicación al frente, no solo a una ventana específica, sino que después de hacer eso, puede usar focus_force() en un marco o ventana específico y eso se focus_force() para convertirse en el primer plano de Todas sus ventanas de aplicación.

Para aquellos interesados, no escribí el system() llamarme. Lo encontré en este hilo en SourceForge .

El hecho de que coloque la llamada al system() dentro de un bloque if que verifica que esto se ejecuta en OS X hace que la solución sea multiplataforma. focus_force() tengo entendido, focus_force() funciona en todas las demás plataformas exactamente como lo desea, y solo lo focus_force() después. La invocación de system() tampoco causaría ningún problema en OS X.

Vine aquí preguntándome la misma pregunta, pero encontré esta sabia respuesta de Kevin Walzer que sugiere usar py2app :

Sí, este es el comportamiento estándar de OS X. La ejecución de una aplicación en la Terminal se mantiene enfocada en la Terminal a menos que cambie haciendo clic en Windows. El comportamiento de la ficha Comando está determinado por el sistema de ventanas, no por un proceso creado recientemente.

La forma de evitar esto es envolver su aplicación en un paquete de aplicaciones Mac estándar usando py2app. El usuario promedio de Mac no va a lanzar un juego basado en Python desde la línea de comandos.

Kevin

(desde https://groups.google.com/forum/#!topic/comp.lang.python/ZPO8ZN5dx3M )

¿Wait_visibility y event_generate ayudan?

p.ej. algo como –

 from Tkinter import * root = Tk() def key(event): print "pressed", event.char def callback(event): print "clicked at", event.x, event.y frame = Frame(root, width=100, height=100) frame.bind("", key) frame.bind("", callback) frame.pack() frame.focus_set() root.wait_visibility() root.event_generate('', x=0, y=0) root.mainloop()