Linux 上的 PyQt 应用程序冻结屏幕,Windows 上正常

PyQt Application Frozen Screen on Linux, fine on Windows

我已经在 Windows 上编写 PyQt 应用程序一段时间了,我想看看它是否会 运行 在 Linux 上正常运行。 gui 应用程序基本上是一个 shell 的科学工具包,旨在用于 qtconsole/notebook。 Linux 和 Windows 系统都基于 Anaconda 3.5 和 运行ning PyQt5。它在 Windows 上工作正常,但是当我在 Linux 上 运行 时,Qt window 弹出位只是冻结 window 下方的图形(见下图)。命令行上没有显示任何错误,window 只是弹出,根本不显示小部件。此外,当我尝试使用 window 顶部的 x 按钮关闭时,它会显示一个 "Application not responsive" 对话框,我必须强制退出。

代码库非常大(对于这个 post 来说太大了)所以我真的无法为这个问题放入代码示例(我无法重现错误还在这个程序之外)。我可以说我确实从该站点获得了一些用于简单 gui 程序的示例: https://github.com/Deusdies/pythonbo。我的代码有很多小部件子类化,使用 pyqtgraph(来自 github 的最新版本)进行绘图,并且有很多 MDI subwindows.

底层工具包的其他包包括:

当我尝试 运行 任何 MDI 子 window 小部件作为单独的程序时,我遇到了与 运行 主程序相同的问题。

我想我很好奇是否有人曾 运行 遇到过这种情况,并且可以提出一些可能的事情,我应该调查一下,看看可能是什么问题。

一般答案是正在初始化 2 个 QApplication 事件循环。

问题代码出在我一直使用的一个名为 pyperclip 的小模块中,该模块首先被导入,然后我在我的 gui 代码底部实例化了我的 QApplication。

这在 Windows 上不是问题,因为 pyperclip 可以在某种程度上本地访问 Windows 剪贴板,但在 Linux 上它使用 QtClipboard。我的解决方案是编辑 pyperclip 代码以检测应用程序是否已经 运行,然后在导入 pyperclip

之前实例化我的 gui 应用程序

编辑代码

在 pyperclip 代码中,pyperclip.clipboards 模块,第 51 行我更改了这一行:

app = QApplication([])

对此:

app = QApplication.instance()
if app is None:
    app = QApplication([])