2013-07-21 11 views
10

Piszę aplikację w Pythonie za pomocą interfejsu GUI programu Tkinter. Słucha zdarzeń klawiatury i myszy, więc musi mieć fokus. Gdy jest uruchomiony z terminalu w Ubuntu, następujący kod działa:Koncentrują się okna Tkinter na systemie Mac OS X

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

Jednak, gdy uruchomiony z terminala w systemie Mac OS X 10.8.4 (Zdjęcie Python 2.7.2), ostrość jest zatrzymywane przez terminal emulatora, dopóki użytkownik nie kliknie okna. Czy ktoś wie o obejście tego problemu?

Odpowiedz

9

Próbowałem to i to działa dobrze dla mnie:

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

Oczywiście, że będzie zabrać ze sobą całą aplikację do przodu, nie tylko określone okno, ale po wykonaniu tej czynności można następnie użyć focus_force() w określonej ramce lub oknie, które zostanie przeniesione, aby stać się najbardziej na wierzchu wszystkich okien aplikacji.

Dla zainteresowanych, nie napisałem samemu tego telefonu pod numerem system(). Znalazłem go w this thread on SourceForge.

Fakt, że mogę umieścić wezwanie system() wewnątrz bloku if że weryfikuje ten działa na OS X sprawia, że ​​platforma rozwiązanie cross - moje rozumienie jest focus_force() prace na wszystkich innych platformach dokładnie tak, jak chcesz, i po prostu wykonując go po Inwokacja system() również nie spowoduje żadnych problemów w systemie OS X.

+1

Łatwy by-gosh-make-it-work-now hack :-). Dzięki! – yair

-1

Czy wait_visibility i event_generate help?

np. coś podobnego -

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() 
+0

Niestety nie –

2

przyszedł tu zastanawiać, to samo pytanie, ale uważam, że ten mądry brzmiącą odpowiedź od Kevin Walzer co sugeruje użycie py2app:

Tak, jest to zachowanie standardowe dla OS X. Running aplikacja w Terminalu zachowuje ostrość w Terminalu, chyba że przełączasz się, klikając okna. Zachowanie polecenia Tab- jest określane przez system okienkowy, a nie przez nowo utworzony proces .

Rozwiązaniem jest zapakowanie aplikacji w standardowy pakiet aplikacji Macintosh za pomocą pakietu py2app. Przeciętny użytkownik Maca nie uruchomi z poziomu wiersza poleceń gry opartej na pythonie .

Kevin

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

+0

Można również użyć programu [Pyinstaller] (http://www.pyinstaller.org/). Podoba mi się, ponieważ mogę tworzyć zarówno pakiety aplikacji Mac, jak i pliki wykonywalne Windows. – Fiver