无法同时运行matplotlib和pyqt4

时间:2016-07-06 00:16:04

标签: python matplotlib pyqt4

我正在使用PyQt4运行一些代码,我想用它的数据绘制一个数字。但是当我尝试这样做时,它会报告

QPixmap: Must construct a QGuiApplication before a QPixmap

以下是代码:

from PyQt4 import QtCore
import sys
import matplotlib.pyplot as plt
import numpy as np
def run():
   #here is some code, I delete them since they are useless for this question
   return data1 #data1 is a list with 30 elements

app = QtCore.QCoreApplication(sys.argv)
client.finished.connect(app.quit)
QtCore.QTimer().singleShot(0,lambda:client.timed_range_stream(5000))
app.exec_()
fig = plt.figure()
ax1 = fig.add_subplot(111)
data2 = run()
datalen = np.linspace(0,10,len(data2))
ax1.plot(datalen,data2,lw = 2)
plt.show()

由于matplotlib使用pyqt4作为后端,我很困惑为什么会发生这个错误。它应该自动创建一个QGuiApplication。我的意思是我之前是否使用pyqt4,'app.exec_()'下面的代码应该自动创建一个QGuiApplication。如果我错了,请指出。

真的很感谢你的帮助!请给我一些建议。

1 个答案:

答案 0 :(得分:2)

PyQt的抱怨是你没有运行Gui EventLoop。 app.exec_()肯定会启动一个事件循环,但这取决于app是什么。在你的情况下它的QCoreApplication对象。你怎么期望它开始一个Gui EventLoop?这就像买一个平底锅,并期待它煮比萨饼。

matplotlib肯定基于PyQt。我相信你也可以在仅限控制台的应用程序中使用它。因此,PyQt将无法判断您是否需要gui或控制台应用程序。

在编写基于控制台的应用程序时使用

QCoreApplication。管理的事件和流程较少。如果你想展示一个窗口,即使是一个简单的窗口,也需要更多的工作。还有那个在QGuiApplication

中处理额外工作的野兽

现在到Qt版本。您使用的是PyQt4,但投诉说您需要创建QGuiApplication。但是,在Qt4 / PyQt4中没有QGuiApplication或任何对它的引用。这让我相信,你的matplotlib副本可能正在使用PyQt5,或者PyQt5依赖来自一些不明确的来源,我不确定。检查所用PyQt版本的详细信息。

如果您正在使用PyQt4,请在开头添加from PyQt4 import QtGui。 然后将app = QtCore.QCoreApplication(...)更改为app = QtGui.QApplication(...)

如果PyQt5在开头添加from PyQt5 import QtGui, QtWidgets。 然后将app = QtCore.QCoreApplication(...)更改为app = QtWidgets.QApplication(...)

这将解决你的问题。

PS:记住,你不能混用PyQt4和PyQt5。