我正在使用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。如果我错了,请指出。
真的很感谢你的帮助!请给我一些建议。
答案 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。