我在 Windows 上编写 PyQt 应用程序已经有一段时间了,我想看看它是否能在 Linux 上正常运行。 GUI 应用程序基本上是一个科学工具包的外壳,旨在在 qtconsole/笔记本上使用。 Linux和Windows系统都基于Anaconda 3.5,并运行PyQt5。它在 Windows 上运行良好,但当我在 Linux 上运行时,弹出的 Qt 窗口只是卡住了窗口下方的图形(见下图)。命令行上根本没有显示任何错误,窗口只是弹出,根本不显示小部件。此外,当我尝试使用窗口顶部的 x 按钮关闭时,它会显示“应用程序不响应”对话框,我必须强制执行。
代码库非常大(对于这篇文章来说太大了),所以我实际上无法为这个问题放入代码示例(我还无法在这个程序之外重现该错误)。我可以说我确实从这个网站获得了一些适用于简单 GUI 程序的示例: https://github.com/Deusdies/pythonbo 。我的代码有很多小部件子类化,使用 pyqtgraph(来自 github 的最新版本)进行绘图,并且有很多 MDI 子窗口。
底层工具包的其他软件包包括:
- numpy、numba、scipy、matplotlib
- lmfit
- pyexcel、pyexcel-xlsx
- pyvisa、pyserial
- pyperclip
当我尝试将任何 MDI 子窗口小部件作为单独的程序运行时,我遇到了与运行主程序相同的问题。
我想我很好奇是否有人以前遇到过这种情况,并且可以建议我应该调查一下可能出现的问题。
最佳答案
一般答案是正在初始化 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([])
关于python - PyQt 应用程序在 Linux 上卡住屏幕,在 Windows 上正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38166420/