PyQt + Matplotlib
用PyQt画出一个窗体,在其中可以显示matplotlib画的图。
- 学习视频
ptqt基础入门学习
b站大神pyqt+matplotlib教学
1 在pycharm中集成外部插件
windows系统:pycharm -> File -> Settings -> Tools -> External Tools
-
Qt Designer:
Name随便填
Program填designer.exe所在的位置,在anaconda的Library的bin文件夹里
Working directory填$ProjectFileDir$
(看视频里这么填的)PyUIC
这是一个可以把 Qt Designer生成的布局文件: xxx.ui 转换成python格式的 xxx.py 的扩展工具
Program填 python.exe的位置
Arguments填-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
可以把“.ui”格式的文件转换成同名的 “,py”文件
Working directory填$FileDir$
2 将.ui文件转成 .py文件并运行
在 Qt Designer中保存布局文件,在pycharm中用PyUIC插件转成 .py文件
from PyQt5.QtWidgets import QApplication,QMainWindow
app = QApplication(sys.argv)
mainWindow = QMainWindow()
ui = ui_py.Ui_MainWindow() #ui_py即插件生成的py文件,Ui_MainWindow()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec())
3.在pyqt窗体中显示matplotlib画的图
GUI_plot.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'GUI_plot.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from plot import plot
from PIL import Image
import numpy as np
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(588, 471)
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(110, 50, 320, 240))
self.label.setText("")
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.label_xlist = QtWidgets.QLabel(Dialog)
self.label_xlist.setGeometry(QtCore.QRect(160, 350, 54, 12))
self.label_xlist.setObjectName("label_xlist")
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(230, 350, 141, 20))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(230, 400, 141, 21))
self.lineEdit_2.setText("")
self.lineEdit_2.setObjectName("lineEdit_2")
self.label_ylist = QtWidgets.QLabel(Dialog)
self.label_ylist.setGeometry(QtCore.QRect(160, 400, 54, 12))
self.label_ylist.setObjectName("label_ylist")
self.Button = QtWidgets.QPushButton(Dialog)
self.Button.setGeometry(QtCore.QRect(260, 440, 75, 23))
self.Button.setObjectName("Button")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
# 触发事件
self.Button.clicked.connect(self.plot)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.label_xlist.setText(_translate("Dialog", "xlist"))
self.label_ylist.setText(_translate("Dialog", "ylist"))
self.Button.setText(_translate("Dialog", "生成"))
# 这是自己写的函数
def check(self, text):
# 检查输入是否合法
if text:
if "," not in text:
return False
else:
return True
else:
return False
def plot(self):
xlist = self.lineEdit.text()
ylist = self.lineEdit_2.text()
if self.check(xlist) and self.check(ylist):
img = plot(xlist, ylist)
img1 = img.resize((320, 240))
self.label.setPixmap(img1.toqpixmap())
else:
self.label.setText("请输入数字列表")
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWindow = QMainWindow()
ui = Ui_Dialog()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec())
plot.py
import matplotlib.pyplot as plt
import io
from PIL import Image
def plot(xlist, ylist):
# xlist = "0,1,2,3"
# ylist = "0,1,2,3"
xlist = [float(i) for i in xlist.split(",")]
ylist = [float(i) for i in ylist.split(",")]
plt.plot(xlist, ylist)
buffer = io.BytesIO()
plt.savefig(buffer, format='PNG')
img = Image.open(io.BytesIO(buffer.getvalue()))
plt.close()
buffer.close()
return img
if __name__ == '__main__':
xlist = "0,1,2,3"
ylist = "0,1,2,3"
plot(xlist,ylist)