PyQt5を使ってみる

環境

Windows 10 Pro(CPU only)
Python 3.7.5

まずは最小画面の描画

  • バージョン
PyQt5==5.13.2
PyQt5-sip==12.7.0
  • コード
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt5 sample")
        self.setGeometry(50, 50, 660, 660)
        
        self.button1 = QPushButton('Open Img', self)
        self.button1.setGeometry(QtCore.QRect(20, 20, 100, 30))
    
        self.img_label1 = QLabel(self)
        self.img_label1.setGeometry(QtCore.QRect(74, 120, 512, 512))
        self.img_label1.setFrameStyle(QFrame.Box | QFrame.Plain)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex =Window()
    ex.show()
    sys.exit(app.exec_())
  • 結果

f:id:touch-sp:20191118161359p:plain:w400

つぎにボタンを押したときの動作を定義する(画像表示)

  1. ボタンを押すとファイル選択画面が開く
  2. ファイルを選択すると画面に表示する
  • 追加するコード
from PyQt5.QtGui import QImage, QPixmap
        self.button1.clicked.connect(self.showDialog1)
    def showDialog1(self):

        fname = QFileDialog.getOpenFileName(self, 'Open file')

        # fname[0]は選択したファイルのパス(ファイル名を含む)
        if fname[0]:
            # 画像の読み込み, サイズ変更
            image = QImage(fname[0]).scaled(512,512,QtCore.Qt.KeepAspectRatio) 
            # 画像の表示
            self.img_label1.setPixmap(QPixmap.fromImage(image))
  • 最終的なコード
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QImage, QPixmap

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt5 sample")
        self.setGeometry(50, 50, 660, 660)
        
        self.button1 = QPushButton('Open Img', self)
        self.button1.setGeometry(QtCore.QRect(20, 20, 100, 30))
    
        self.img_label1 = QLabel(self)
        self.img_label1.setGeometry(QtCore.QRect(74, 120, 512, 512))
        self.img_label1.setFrameStyle(QFrame.Box | QFrame.Plain)

        self.button1.clicked.connect(self.showDialog1)

    def showDialog1(self):

        fname = QFileDialog.getOpenFileName(self, 'Open file')

        # fname[0]は選択したファイルのパス(ファイル名を含む)
        if fname[0]:
            # 画像の読み込み, サイズ変更
            image = QImage(fname[0]).scaled(512,512,QtCore.Qt.KeepAspectRatio) 
            # 画像の表示
            self.img_label1.setPixmap(QPixmap.fromImage(image))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex =Window()
    ex.show()
    sys.exit(app.exec_())

matplotlibのグラフを表示させる

  • バージョン
cycler==0.10.0
kiwisolver==1.1.0
matplotlib==3.1.1
numpy==1.17.4
pyparsing==2.4.5
PyQt5==5.13.2
PyQt5-sip==12.7.0
python-dateutil==2.8.1
six==1.13.0
  • 最終コード
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import pyplot as plt
import numpy as np

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt5 sample")
        self.setGeometry(50, 50, 660, 660)
        
        self.button1 = QPushButton('Open Img', self)
        self.button1.setGeometry(QtCore.QRect(20, 20, 100, 30))
    
        self.FigureWidget = QWidget(self)
        self.FigureWidget.setGeometry(QtCore.QRect(74, 120, 512, 512))
        self.FigureLayout = QVBoxLayout(self.FigureWidget)
        
        self.figure = plt.figure()
        self.axes = self.figure.add_subplot(111)
        self.axes.axis('off')
        self.canvas = FigureCanvas(self.figure)
        
        self.FigureLayout.addWidget(self.canvas)

        self.button1.clicked.connect(self.plot)

    def plot(self):

        x1=np.arange(0, 4*np.pi, 0.1)
        y1=np.sin(x1)
        self.axes.plot(x1,y1,c='r')
        self.axes.axis('on')
        self.canvas.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex =Window()
    ex.show()
    sys.exit(app.exec_())

  • グラフが二つになってもほぼ同様
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import *

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib import pyplot as plt
import numpy as np

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("pyQt5 sample")
        self.setGeometry(50, 50, 660, 660)
        
        self.button1 = QPushButton('Open Img', self)
        self.button1.setGeometry(QtCore.QRect(20, 20, 100, 30))
    
        self.FigureWidget = QWidget(self)
        self.FigureWidget.setGeometry(QtCore.QRect(74, 120, 512, 512))
        self.FigureLayout = QVBoxLayout(self.FigureWidget)
        
        self.figure = plt.figure()
        self.axes1 = self.figure.add_subplot(211)
        self.axes1.axis('off')
        self.axes2 = self.figure.add_subplot(212)
        self.axes2.axis('off')
        self.canvas = FigureCanvas(self.figure)
        
        self.FigureLayout.addWidget(self.canvas)

        self.button1.clicked.connect(self.plot)

    def plot(self):

        x1=np.arange(0, 4*np.pi, 0.1)
        y1=np.sin(x1)
        self.axes1.plot(x1,y1,c='r')
        self.axes1.axis('on')
        self.axes2.plot(x1,y1,c='r')
        self.axes2.axis('on')
        self.canvas.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex =Window()
    ex.show()
    sys.exit(app.exec_())