2013-07-21 168 views
10

我正在用Tkinter GUI框架在Python中編寫應用程序。它監聽鍵盤和鼠標事件,因此它必須有焦點。當它從在Ubuntu終端啓動時,下面的代碼工作:Tkinter窗口焦點在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() 

然而,從在Mac OS X 10.8.4(股票的Python 2.7.2)的終端啓動時,聚焦是由終端保持直到用戶點擊窗口。有誰知道這個解決方法嗎?

回答

9

我想這和它的工作很適合我:

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

當然,這會帶給你的整個應用程序前,不僅僅是一個特定的窗口,但是當你這樣做後,你就可以在特定的框架或窗口上使用focus_force(),這樣就會變成所有應用程序窗口的最前端。

對於那些有興趣的人,我沒有寫自己的system()調用。我在this thread on SourceForge找到它。

,我把system()調用的,如果塊驗證這是在OS X上運行中的事實使得該解決方案跨平臺 - 我的理解是,focus_force()適用於所有其他平臺完全按照你想要的,經過短短演藝吧在OS X中調用system()也不會導致任何問題。

+1

一個簡單的天作之合 - 現在工作 - 現在破解:-)。謝謝! – yair

-1

做wait_visibility和event_generate幫助嗎?

例如。像 -

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

不幸的是不是 –

2

來到這裏,想知道同樣的問題,但我發現,從凱文·沃爾澤這一明智的冠冕堂皇答案,建議使用py2app

是的,這是OS X上運行標準行爲終端 中的應用程序會一直關注終端,除非您通過單擊窗口進行切換。命令選項卡的行爲由窗口系統決定,而不是由新產生的進程決定。

解決方法是使用py2app將應用程序包裝在標準的Mac應用程序 包中。普通的Mac用戶不會從命令行啓動基於Python的遊戲 。

凱文

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

+0

您也可以使用[pyinstaller](http://www.pyinstaller.org/)。我喜歡它,因爲我可以製作Mac App捆綁包和Windows可執行文件。 – Fiver