2

在我的 (Py)Qt4 应用程序中,主窗口不会出现,直到用户使用命令选项卡从应用程序切换,然后命令选项卡返回到它。

奇怪的是,这个问题只有在 Finder 中双击我的 .app 时才会出现。如果我从命令行启动应用程序,它可以正常工作

此外,我尝试将以下几行添加到我的代码中,但似乎没有任何效果:

mainWindow.show()
mainWindow.raise_()
mainWindow.repaint()
QApplication.postEvent(QEvent.ApplicationDeactivate)
QApplication.postEvent(QEvent.ApplicationActivate)
QApplication.instance().processEvents()

我认为这可能是与线程相关的问题,但我几乎可以在任何地方插入这一行:

assert threading.current_thread().name == "MainThread"

最后一个问题:我不知道它是否相关,但我的启动屏幕没有正确隐藏自己(尽管调用splashscreen.finish(mainWindow))。(如果我完全注释掉启动画面,主窗口仍然会出现上述行为异常。)

为什么我的应用程序包的行为与从命令行启动不同?知道如何诊断吗?我py2app用来生成我的应用程序包。

编辑:这个邮件列表项解释了问题,给出了一个最小的测试用例。SPOILER:事实证明argv_emulation选项是问题所在。它不应该与 GUI 应用程序一起使用。

4

3 回答 3

1

我遇到过同样的问题; 我发现该错误并未在 32 位 Snow Leopard 系统上出现,但完全相同的 py2app 包在 64 位 Lion 和 Mountain Lion 上出现了该问题。

关闭argv_emulation并没有解决我的问题(我的应用程序无法以其他方式启动)。

我的快速和肮脏的修复:在调用之后show(),添加如下调用:

os.system("open -a /path/to/your.app")

在 OS X 上,这基本上相当于通过其停靠图标激活(已经运行的)应用程序;主窗口立即出现。

于 2013-09-13T12:29:39.913 回答
1

您应该可以通过在主窗口上调用 show() 和 raise_(​​) 来解决此问题。

IIRC,您两者都需要,并且您可能按顺序需要它们。这适用于 ubuntuone 控制面板应用程序,它是 PyQt 并使用 py2app 打包。

关于这个重复问题的答案有更多背景信息:为什么我的 PyQt 应用程序在 Mac OS X 的后台打开?

于 2013-05-15T20:45:39.990 回答
1

这里的问题原来是我使用了该argv_emulation选项,该选项不适用于 GUI 应用程序。设置该选项以False解决问题。

(另见: http: //mail.python.org/pipermail/pythonmac-sig/2013-August/023992.html

(另外,请参阅py2app/bootstrap/argv_emulation.py中的注释

于 2013-08-13T12:02:21.033 回答