环境配置
安装
在python环境中使用pip
安装PyQt5
和PyQt5-tools
。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5-tools
Pycharm配置
启动pycharm后新建一个项目,打开File->Setting->Tools->External Tools->(+)
创建一个外部工具。其中工具名称可以填写其他的,有辨识度即可,Programs
可以在Python_path/Lib/site_packages/...
里面搜索找到designer.exe
的位置,复制到这里即可。
大致应该在类似这样的目录下:
D:\anaconda3\Lib\site-packages\qt5_applications\Qt\bin
Working directory
的地方设置为$FileDir$
,每次打开这个工具即可定位到项目的目录下。这个工具可以直接在PyCharm里面打开Qt Designer
。
按照同样的方法,设置另外一个工具PyUIC
,其中Program
直接设置为python.exe
即可,Arguments
需要设置为-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py
,Working directory
的地方设置为$FileDir$
。
配置完成以后,右击项目名称找到External Tools
能看到刚才设置的两个工具,也可以通过Tools->External Tools
找到,如果没有的话,重启Pycharm即可。
设计GUI
打开一个QtDesigner
,即可自己设计一个GUI界面。如果类似matplotlib
的绘图控件,需要拉一个Widget
控件,简单拉了一个Widget
控件和一个按钮。然后进行保存,文件保存的后缀为.ui
。需要将.ui
文件转化为.py
文件。这里只需要将External Tools
的PyUIC
运行一下即可。出现了如下信息即表示转化成功。在项目下也可以看到GUI.py
和gui.ui
两个文件。
path_for_python\python.exe -m PyQt5.uic.pyuic GUI.ui -o GUI.py
Process finished with exit code 0
在GUI中绘图
每一次运行QtDesigner
修改了UI后,都需要通过PyUIC
转换为新的.py
文件,都会覆盖掉我们自己的代码,所以一般新建一个新的文件来写入自己的代码。
matplotlib作图嵌入PyQt界面的关键在于需要创建一个图形类,通过继承FigureCanvas类,使其相当于PyQt里的控件,从而完成PyQt与Matlibplot的结合。
class Myplot(FigureCanvas):
def __init__(self, width=5, height=3, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
FigureCanvas.__init__(self, self.fig)
self.axes= self.fig.add_subplot(111)
self.compute_initial_figure()
def compute_initial_figure(self):
pass
对于按钮控件的相应函数需要写一个on_xxx_clicked
的函数。
@pyqtSlot()
def on_pushButton_clicked(self):
x = [i for i in range(100)]
self.plot_ctrl_canvas.axes.plot(x)
self.plot_ctrl_canvas.draw()
创建的新文件整体代码如下:
# encoding: utf-8
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QMainWindow, QGridLayout
from PyQt5.QtCore import QTimer, pyqtSlot, QThread
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import sys, random, time, os, re
from GUI import Ui_MainWindow
class Myplot(FigureCanvas):
def __init__(self, width=5, height=3, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
FigureCanvas.__init__(self, self.fig)
self.axes = self.fig.add_subplot(111)
self.compute_initial_figure()
def compute_initial_figure(self):
pass
class AppWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(AppWindow, self).__init__(parent)
self.setupUi(self)
self.plot_ctrl_canvas = Myplot()
self.gridlayout1 = QGridLayout(self.plot_ctrl)
self.gridlayout1.addWidget(self.plot_ctrl_canvas)
show_bar = True
if show_bar:
self.fig_ntb1 = NavigationToolbar(self.plot_ctrl_canvas, self)
self.gridlayout1.addWidget(self.fig_ntb1)
@pyqtSlot()
def on_pushButton_clicked(self):
x = [i for i in range(100)]
self.plot_ctrl_canvas.axes.plot(x)
self.plot_ctrl_canvas.draw()
if __name__ == "__main__":
app = QApplication(sys.argv)
win = AppWindow()
win.show()
sys.exit(app.exec_())
绘图的基本操作
- 创建一个Myplot对象并绑定控件
self.plot_ctrl_canvas = Myplot() self.gridlayout1 = QGridLayout(self.plot_ctrl) self.gridlayout1.addWidget(self.plot_ctrl_canvas)
- 显示matplotlib的工具栏
self.fig_ntb1 = NavigationToolbar(self.plot_ctrl_canvas, self) self.gridlayout1.addWidget(self.fig_ntb1)
- 在plot后需要调用
draw
方法更新。self.plot_ctrl_canvas.axes.plot(x) self.plot_ctrl_canvas.draw()
- 其他:
self.plot_ctrl_canvas.axes.cla() # 清除绘图 self.plot_ctrl_canvas.axes.set_title(title,fontsize=18,color='c')# 设置绘图标题 self.plot_ctrl_canvas.axes.set_xlabel("delay(s)",fontsize=18,color='c') # 设置x轴标签 self.plot_ctrl_canvas.axes.set_ylabel("counts",fontsize=18,color='c') # 设置y轴标签
PyQt的控件操作
- 状态栏设置文字:
self.statusbar.showMessage('Init Component Ready')
- 菜单栏设置相应函数:
self.actionAbout_Me.triggered.connect(self.show_about)
- 常见MessageBox:
def show_about(self): QtWidgets.QMessageBox.about(self, "About", """软件描述""")
代码可在csdn Download进行下载。
参考
- PyQt完整入门教程,https://www.cnblogs.com/lovesoo/p/12491361.html
- 利用PyQt5+Matplotlib 绘制静态/动态图的实现代码,https://www.jb51.net/article/190649.htm