Tkinter 窗口专注于 Mac OS X
Posted
技术标签:
【中文标题】Tkinter 窗口专注于 Mac OS X【英文标题】:Tkinter window focus on Mac OS X 【发布时间】:2013-07-20 10:29:49 【问题描述】:我正在使用 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)中的终端启动时,终端模拟器会保留焦点,直到用户单击窗口。有谁知道这个的解决方法?
【问题讨论】:
【参考方案1】:来到这里想知道同样的问题,但我从 Kevin Walzer 那里找到了这个明智的回答,建议使用py2app
:
是的,这是 OS X 的标准行为。在终端中运行应用程序 除非您通过单击窗口进行切换,否则将焦点保持在终端中。这 Command-Tab 行为由窗口系统决定,而不是由 新生成的进程。
解决此问题的方法是将您的应用程序封装在标准 Mac 应用程序中 使用 py2app 捆绑。普通的 Mac 用户不会启动 来自命令行的基于 Python 的游戏。
凯文
(来自https://groups.google.com/forum/#!topic/comp.lang.python/ZPO8ZN5dx3M)
【讨论】:
您也可以使用pyinstaller。我喜欢它,因为我可以制作 Mac App 包和 Windows 可执行文件。【参考方案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 块中以验证它是否在 OS X 上运行,这一事实使该解决方案跨平台 - 我的理解是 focus_force()
可以在所有其他平台上完全按照您的意愿工作,并且只是在system()
调用之后执行它也不会在 OS X 中造成任何问题。
【讨论】:
【参考方案3】: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()
【讨论】:
以上是关于Tkinter 窗口专注于 Mac OS X的主要内容,如果未能解决你的问题,请参考以下文章