我正在使用 Tkinter GUI 框架用 Python 编写一个应用程序。它监听键盘和鼠标事件,所以它必须有焦点。当它从 Ubuntu 中的终端启动时,以下代码有效:
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)中的终端启动时,终端仿真器会保留焦点,直到用户单击窗口。有谁知道解决这个问题的方法吗?
最佳答案
我试过了,效果很好:
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()
调用放在一个 if block 中,以验证它是否在 OS X 上运行,这使得解决方案跨平台 - 我的理解是 focus_force()
可以完全按照您的意愿在所有其他平台上运行,并且在 system()
调用之后执行它也不会在 OS X 中造成任何问题。
关于python - Tkinter 窗口专注于 Mac OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17774859/