【问题标题】:Tkinter window focus on Mac OS XTkinter 窗口专注于 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)中的终端启动时,终端模拟器会保留焦点,直到用户单击窗口。有谁知道这个的解决方法?

【问题讨论】:

    标签: python macos tkinter


    【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2013-06-28
        • 2019-07-22
        • 2014-08-30
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 2020-10-22
        • 2012-03-16
        • 1970-01-01
        相关资源
        最近更新 更多