Tkinter window focus sur Mac OS X

j'écris une application en Python avec le cadre GUI de Tkinter. Il écoute les évènements clavier et souris, il doit donc avoir la mise au point. Lorsqu'il est lancé à partir D'un terminal D'Ubuntu, le code suivant fonctionne:

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>", key)
frame.bind("<Button-1>", callback)
frame.pack()
frame.focus_force()

root.mainloop()

cependant, lorsqu'il est lancé à partir d'un terminal Mac OS X 10.8.4 (stock Python 2.7.2), focus est conservé par l'émulateur du terminal jusqu'à ce que l'utilisateur clique sur la fenêtre. Personne ne sait d'une solution pour cela?

10
demandé sur Sean W. 2013-07-21 21:16:22

3 réponses

j'ai essayé et ça a bien fonctionné pour moi:

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' ''')

bien sûr, qui va apporter toute votre application à l'avant, pas juste une fenêtre spécifique, mais après vous faites cela, vous pouvez alors utiliser focus_force() sur un cadre ou une fenêtre spécifique et qui sera déplacé pour devenir le premier de toutes vos fenêtres d'application.

pour ceux qui sont intéressés, je n'ai pas écrit le system() appel moi-même. Je l'ai trouvé dans ce fil sur SourceForge.

Le fait que je mettre le system() appeler à l'intérieur d'un bloc if qui vérifie que ceci fonctionne sur OS X fait que la solution traverse la plate - forme-ma compréhension est que focus_force() fonctionne sur toutes les autres plateformes, exactement comme vous le voulez, et juste l'effectuer après le system() l'invocation ne causerait pas non plus de problèmes à OS X.

10
répondu ArtOfWarfare 2014-09-20 03:39:58

est venu ici en se demandant la même question, mais j'ai trouvé cette réponse sage de Kevin Walzer qui suggère d'utiliser py2app:

Oui, c'est le comportement standard pour mac OS X. l'Exécution d'une application dans un Terminal garde la mise au point dans le Terminal à moins que vous commutez en cliquant sur windows. Le Le comportement commande-onglet est déterminé par le système de fenêtrage, pas par un nouvellement généré processus.

le moyen de contourner cela est d'envelopper votre application dans une application Mac standard bundle avec py2app. L'utilisateur Mac moyen ne va pas lancer un Jeu basé sur Python depuis la ligne de commande.

Kevin

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

2
répondu David Lam 2014-11-23 15:06:01

est-ce que wait_visibility et event_generate aident ?

par exemple. quelque chose comme:

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>", key)
frame.bind("<Button-1>", callback)
frame.pack()

frame.focus_set()

root.wait_visibility()
root.event_generate('<Button-1>', x=0, y=0)

root.mainloop()
-1
répondu Oblivion 2013-07-23 22:15:24