python - Tkinter 窗口专注于 Mac OS X

标签 python macos tkinter

我正在使用 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/

相关文章:

java - 在我的Mac上找不到已安装的jdk

python - 面向对象的 Tkinter 函数 - 我如何将其放入?

python - 将 python 字符串从列表打印到 gui

python - 慢速 FuncAnimation 脚本

python - 在 numpy 中修改数组值时需要省略号 [...] 吗?

python - 使用 Tensorflow Serving 服务 Keras 模型

python - 使用 numpy.polyfit 提取多变量方程系数

macos - Arduino 未在 Mac Catalina 10.15.4 上检测到 FTDI 串行

python - 将单选按钮和条目的位置设置在同一列中,但结果未对齐

macos - 默认情况下,如何在 'top' 上按 CPU% 排序?