在Linux上的PyQt应用程序冻结屏幕,在Windows上罚款

我一直在Windows上编写一个PyQt应用程序,我想看看它能否在Linux上正常运行。 gui应用程序基本上是用于qtconsole / notebook上的科学工具包的shell。 Linux和Windows系统都基于Anaconda 3.5,并运行PyQt5。 它可以在Windows上正常工作,但是当我在Linux上运行时,Qt窗口会popup窗口,将窗口下方的graphics冻结(参见下图)。 在命令行中没有显示任何错误,只是popup窗口,根本不显示小部件。 此外,当我尝试closures窗口顶部的xbutton时,它显示“应用程序不响应”对话框,我不得不强制执行。

代码基地是相当大的(这个post太大),所以我真的不能真正能够在这个问题的代码示例(我还没有能够重现这个程序之外的错误)。 我可以说,我确实从这个网站的一些简单的GUI程序工作的例子: https : //github.com/Deusdies/pythonbo 。 我的代码有很多的小部件子类化,使用pyqtgraph(来自github的最新版本)的情节,并有很多的MDI子窗口。

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

  • numpy,numba,scipy,matplotlib
  • lmfit
  • pyexcel,pyexcel-xlsx
  • pyvisa,pyserial
  • pyperclip

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

我想我很好奇,如果有人遇到过这种情况,并可以build议可能的事情,我应该探讨,看看可能是什么问题。

冷冻PyQt应用程序

一般的答案是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([])