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的主要内容,如果未能解决你的问题,请参考以下文章

你如何专注于使用 selenium ide 的新窗口?

如何在 Mac OS X 中获取光标相对于窗口的位置?

专注于一个窗口形式的多个列表视图

如何制作一个类似于 Mac OS X 坞站堆栈的窗口?

在 mac OS X 上关闭 GUI emacsclient 后如何将焦点返回到终端?

使用 Tkinter 和 Python 在 Mac OS X 中进行惯性滚动