【问题标题】:Python Tkinter GUI Always loads minimizedPython Tkinter GUI 总是最小化加载
【发布时间】:2012-01-31 17:02:37
【问题描述】:

我有一个简单的 Python 脚本,它在运行时加载一个 GUI(使用 Tkinter 创建)。我使用 py2app 将 Python 脚本转换为 OSX 的双击应用程序。单击应用程序时,Python 会执行脚本。但是,Python(和 GUI)负载最小化。用户必须单击托盘中的 Python 图标才能将 GUI 置于前台。

我尝试将 lift() 添加到 Tkiner 主窗口,但它似乎没有任何效果(我尝试了类似的方法,但没有成功将窗口置于前台)。双击应用程序后,如果 GUI 没有弹出,用户很难知道发生了什么(特别是如果他们希望出现某种界面)。我正在运行 Lion,并且在 Leapord 上没有这个问题。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您是否不小心在窗口上调用了.iconify().withdraw()?无论哪种方式,请尝试在其上调用.deiconify(),这应该会强制它显示。

标签: python user-interface tkinter osx-lion


【解决方案1】:

我刚刚遇到同样的问题并找到了一般原因。所有已发布的解决方法的问题是它们要么不适用于 py2app 构建的可执行文件('-topmost' 解决方法不适用),要么具有严重的副作用(iconify/deiconify 有效,但会导致所有未来的模态窗口停止被关闭的应用程序,包括 tkMessageBox 和 tkFileDialog)。

问题是由py2app的argv_emulation引起的,默认开启。该选项将一些特定于 OSX 的 Carbon 事件代码放在应用程序的引导加载程序中,可以在构建的应用程序包的 dist/appname/Contents/Resources/__ boot __.py 中找到。我不需要 argv_emulation,所以现在我只是通过在 py2applet 构建的 setup.py 的 OPTIONS 字典中将 argv_emulation 更改为 False 来禁用该功能:

OPTIONS = { 'argv_emulation' : False }

【讨论】:

    【解决方案2】:

    通过在 root.mainloop() 之前添加以下内容,我已经能够让 tkinter 在 Lion 上玩得很好:

     root.attributes('-topmost', 1)
     root.update()
     root.attributes('-topmost', 0)
    

    【讨论】:

      【解决方案3】:

      好的,我找到了一个可行的解决方案。从 shell 启动不同于启动已编译的应用程序,此解决方案为我编译的 Python/Tkinter 应用程序修复了 Lion 下的后台窗口问题

          root.iconify()
          root.deiconify()
      

      窗口仍然默认出现在后台,但是在 root.mainloop() 调用之前的 iconify 和 deiconify 被背靠背调用后弹出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多