LoginSignup
6
6

More than 5 years have passed since last update.

Python Pysideで、PyQtGraphを使用する際は、importする順番に注意

Posted at

とりあえずこれをim.pyとして保存し、実行する。

from PySide import QtCore, QtGui
import pyqtgraph as pg

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")

        self.graph01 = pg.PlotWidget(self.centralwidget)
        self.graph01.setObjectName("graph01")
        self.verticalLayout.addWidget(self.graph01)
        
        self.psbtn = QtGui.QPushButton(self.centralwidget)
        self.psbtn.setObjectName("psbtn")
        self.psbtn.setText("Plot")
        self.verticalLayout.addWidget(self.psbtn)

        QtCore.QObject.connect(self.psbtn, QtCore.SIGNAL("clicked()"), self.plot)
        

    def plot(self):
        frq = 10.0
        duration = 1.0
        samples = 1001
        x = np.linspace(0, duration, samples)
        rad = np.linspace(0, 2 * np.pi * frq, samples)
        y = np.sin(rad)
        self.graph01.plot(x, y)
        

import sys
import numpy as np

pg.setConfigOption('foreground', 'k')
pg.setConfigOption('background', 'w')


class ControlMainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(ControlMainWindow, self).__init__(parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mySW = ControlMainWindow()#class no instance-ka
    mySW.show()
    sys.exit(app.exec_())

こうなる

Screenshot from 2016-08-22 11-11-38.png

最初の二行を入れ替えると

つまりこの順番だと

import pyqtgraph as pg
from PySide import QtCore, QtGui

エラー起きる。
TypeError: arguments did not match any overloaded call:
QGraphicsView(QWidget parent=None): argument 1 has unexpected type 'PySide.QtGui.QWidget'
QGraphicsView(QGraphicsScene, QWidget parent=None): argument 1 has unexpected type 'PySide.QtGui.QWidget'

理由はここに書いてありました

http://www.pyqtgraph.org/documentation/how_to_use.html#pyqt-and-pyside
多分訳になっているはず。

PyQt と PySide

PyQtGraphは、二つのポピュラーなQTライブラリ用のPythonラッパー、PyQtと、PySideをサポートしています。
両パッケージ共に、ほとんど同一のAPI、関数を提供していますが、様々な理由から、どちらか一方を選んで使用すると思います。
pyqtgraphが最初にimportされたとき、pyqtgraphは、次のチェック項目により、どちらのライブラリを使用するかを自動的に決定します。

1 もし、PyQt4が既にimportされているなら、それを使い、
2 そうでなければ、PySideが既にimportされていれば、それを使い、
3 そうでなければ、PyQt4のimportを試みようとし、
4 もし、PyQt4のimportが失敗したら、PySideのimportを試みます。

もし、あなたのシステムに、PyQt4とPySideの両方のライブラリがインストールされていて、どちらか一方でpyqtgraphを使いたいのであれば、単純に、pyqtgraphをimportする前に、そのライブラリをimportするようにしてください。

import PySide ## this will force pyqtgraph to use PySide instead of PyQt4
import pyqtgraph as pg

先ほどのエラー、
argument 1 has unexpected type 'PySide.QtGui.QWidget'は、

self.graph01 = pg.PlotWidget(self.centralwidget)の行で、pyqtgraph.PlotWidgetは、引数にPyQtの何かを入れてもらうつもりだった

'PySide.QtGui.QWidget'が入ってきた。
引数1は想定外の型'PySide.QtGui.QWidget'を持っています。
という状態だと思う。

PyQtGraph

Pythonでプロットするための、ライブラリ。
http://www.pyqtgraph.org/

Matplotlibじゃだめなの?

だめじゃない。
Matplotlibは、Pythonでプロットするためのスタンダードなライブラリ。
けどPyQtGraphの方が早い。
http://yukara-13.hatenablog.com/entry/2013/12/05/025655

PySideとPyQt

PythonでQtを使って、GUIを作りたいなら、この二つから選ぶと思う。
ライセンスに、LGPLとGPLの違いがある。
PySide・・・LGPL。あまり使っている人がいないのか、ネット上に情報少ない気がする。(google検索すると、約 214,000 件)
PyQt・・・GPL。コピーレフト。ユーザーの数は検索結果に現れる気がする。(google検索 667,000件)

6
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6