2016-07-06 29 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