2016-07-06 103 views
0

我正在使用PyQt4运行一些代码,并且我想绘制一个使用其数据的图。但是,当我尝试这样做,它会报告无法同时运行matplotlib和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。请指出我是否错了。

非常感谢您的帮助!请给我一些建议。

回答

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。

+0

非常感谢!我很快就会把你的。 – disccip