2016-07-06 18 views
0

PyQt4を使ってコードを実行していますが、そのデータを使って図をプロットしたいと思います。私がいることをしようとする場合でも、それは以下matplotlibとpyqt4を同時に実行できません

QPixmap: Must construct a QGuiApplication before a QPixmap 

を報告するコードです:matplotlibのは、バックエンドとしてpyqt4使用しているので

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() 

このエラーが起こった理由を、私はとても混乱しています。自動的に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

関連する問題