Qt DesignerでMatplotlibのウィジェットを配置したGUI画面を作成
はじめに
Qtで作成したGUI画面上で、Matplotlibで描いたグラフを描画することはできた。
しかしその場合にQt Designerは使用していなかった。画面デザインにはQt Designerを使うことが不可欠なので、Qt Designerを使う場合にグラフ画面をどのように埋め込むかをまとめる。
Matplotlibのウィジェットを配置したGUI画面をデザインする
Qt Designerのウィジェットボックスの中には、MatplotlibWidgetがあるので、これを画面上に配置して画面構成をデザインする。
ここでは、ボタンとMatplotlibWidgetを配置する。メニュー項目も加える。
このデザインを保存する。ファイル名はなんでもいいが、qtdesigner.uiとしよう。これをいつものようにpyファイルに変換する。
> pyuic4 qtdesigner.ui -o qtdesigner.py
変換の結果、作成されたコードは以下の通り。
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'qtdesigner.ui' # # Created: Wed Oct 22 17:26:35 2014 # by: PyQt4 UI code generator 4.9.6 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(451, 395) self.centralwidget = QtGui.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.verticalLayout_2 = QtGui.QVBoxLayout(self.centralwidget) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.mplwidget = MatplotlibWidget(self.centralwidget) self.mplwidget.setObjectName(_fromUtf8("mplwidget")) self.verticalLayout.addWidget(self.mplwidget) self.drawButton = QtGui.QPushButton(self.centralwidget) self.drawButton.setObjectName(_fromUtf8("drawButton")) self.verticalLayout.addWidget(self.drawButton) self.verticalLayout_2.addLayout(self.verticalLayout) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 451, 24)) self.menubar.setObjectName(_fromUtf8("menubar")) self.menuFile = QtGui.QMenu(self.menubar) self.menuFile.setObjectName(_fromUtf8("menuFile")) MainWindow.setMenuBar(self.menubar) self.actionClose = QtGui.QAction(MainWindow) self.actionClose.setObjectName(_fromUtf8("actionClose")) self.menuFile.addAction(self.actionClose) self.menubar.addAction(self.menuFile.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "Matplotlib embedded window", None)) self.drawButton.setText(_translate("MainWindow", "Draw figure", None)) self.menuFile.setTitle(_translate("MainWindow", "File", None)) self.actionClose.setText(_translate("MainWindow", "Close", None)) from matplotlibwidget import MatplotlibWidget
メインのコードを書く
画面デザインのコードqtdesigner.pyは完成したので、処理を記述し画面を表示するコードを書く。
このコードは下のようになる。ファイル名は何でもいいがmain.pyとする。
import sys from PyQt4 import QtCore from PyQt4 import QtGui from qtdesigner import Ui_MainWindow class DesignerMainWindow(QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(DesignerMainWindow, self).__init__(parent) self.setupUi(self) #グラフを描くためのシグナルとスロット QtCore.QObject.connect(self.drawButton, QtCore.SIGNAL("clicked()"), self.draw_graph) #ウィンドウを閉じるためのシグナルとスロット QtCore.QObject.connect(self.actionClose, QtCore.SIGNAL("triggered()"), QtGui.qApp, QtCore.SLOT("quit()")) def draw_graph(self): #ここでグラフを描く x = [0, 10, 100] y = [3, 4, 5] self.mplwidget.axes.set_xscale('log') self.mplwidget.axes.set_title('GRAPH') self.mplwidget.axes.plot(x,y) self.mplwidget.draw() app = QtGui.QApplication(sys.argv) dmw = DesignerMainWindow() dmw.show() sys.exit(app.exec_())
プログラムを実行する
main.pyを実行するとGUI画面が起動する。画面上のボタンを押すと、グラフが描画される。
ボタンを押す前
ボタンを押した後
Matplotlib for Python Developers: Build Remarkable Publication Quality Plots the Easy Way | |
Sandro Tosi Packt Publishing 2009-10-30 売り上げランキング : 86743 Amazonで詳しく見る by G-Tools |