文章目录

  • 想法和展示
  • 参考
  • 1、qtdesigner界面
  • 2、自己新建pulsemain.py文件
  • 引入的所有的包有:
  • 为了汉字显示,引入:
  • 画图代码
  • 改进——图形随窗口进行自动放缩
  • 实现方法:
  • 展示


想法和展示

博主想使用pyqt5实现python的波形显示界面,最终实现如下图:

python pyqt 主窗口未响应 pyqt界面_python pyqt 主窗口未响应

参考

关于配置pyqt和制作界面,参考博主其他文章:

pycharm配置pyqt5_tools【实测成功】

转载pyqt5的gui实例【实测成功】

1、qtdesigner界面

仅需一个groupbox控件:

python pyqt 主窗口未响应 pyqt界面_子图_02


然后,保存得到.ui文件——关闭——在pycharm里右键,ui——external tools——pyuic5——生成.py文件

(博主的命名为了gui.uigui.py

python pyqt 主窗口未响应 pyqt界面_子图_03

2、自己新建pulsemain.py文件

引入的所有的包有:

#-*-coding:utf-8-*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np
from gui import Ui_Form

import matplotlib
matplotlib.use("Qt5Agg")  # 声明使用QT5
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

为了汉字显示,引入:

plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False  # 步骤二(解决坐标轴负数的负号显示问题)

画图代码


由于自己想读取电脑的txt数据,然后显示;对大佬博主的代码进行了修改,代码如下:

#创建一个matplotlib图形绘制类
class MyFigure(FigureCanvas):
    def __init__(self,width=5, height=4, dpi=100):
        #第一步:创建一个创建Figure
        self.fig = Figure(figsize=(width, height), dpi=dpi)
        #第二步:在父类中激活Figure窗口
        super(MyFigure,self).__init__(self.fig) #此句必不可少,否则不能显示图形
        #第三步:创建一个子图,用于绘制图形用,111表示子图编号,如matlab的subplot(1,1,1)
        self.axes1 = self.fig.add_subplot(311)
        self.axes2 = self.fig.add_subplot(312)
        self.axes3 = self.fig.add_subplot(313)


    #第四步:就是画图,【可以在此类中画,也可以在其它类中画】
    def plotsin(self):
        self.axes0 = self.fig.add_subplot(111)
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes0.plot(t, s)
    def plotcos(self):
        t = np.arange(0.0, 3.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)


class MainDialogImgBW(QDialog,Ui_Form):
    def __init__(self):
        super(MainDialogImgBW,self).__init__()
        self.setupUi(self)
        self.setWindowTitle("显示matplotlib绘制图形")
        self.setMinimumSize(0,0)

        #第五步:定义MyFigure类的一个实例
        self.F = MyFigure(width=30, height=2, dpi=100)
        #self.F.plotsin()
        self.plotcos()
        #第六步:在GUI的groupBox中创建一个布局,用于添加MyFigure类的实例(即图形)后其他部件。
        self.gridlayout = QGridLayout(self.groupBox)  # 继承容器groupBox
        self.gridlayout.addWidget(self.F,0,1)

        #补充:另创建一个实例绘图并显示
        # self.plotother()

    def plotcos(self):
        s = np.loadtxt(r'E:\code\python\20200929gui\a3ecg\plotpulse\L3.txt')
        self.F.axes1.plot(s)
        self.F.axes1.set_title('avr')

        s = np.loadtxt(r'E:\code\python\20200929gui\a3ecg\plotpulse\L3.txt')
        self.F.axes2.plot(s)
        self.F.axes2.set_title('avl')

        t = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        s = [23, 21, 32, 13, 3, 132, 13, 3, 1]
        self.F.axes3.plot(t, s)
        self.F.axes3.set_title('avf')

        self.F.figure.suptitle('心电图')
        # plt.tight_layout()
        # self.F.figure.tight_layout()
    def plotother(self):
        F1 = MyFigure(width=5, height=4, dpi=100)
        F1.fig.suptitle("Figuer_4")

        F1.axes1 = F1.fig.add_subplot(311)
        x = np.arange(0, 50)
        y = np.random.rand(50)
        F1.axes1.plot(x, y)
        F1.axes1.set_title("hist")

        ## 调用figure下面的add_subplot方法,类似于matplotlib.pyplot下面的subplot方法
        F1.axes2 = F1.fig.add_subplot(312)
        x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        y = [23, 21, 32, 13, 3, 132, 13, 3, 1]
        F1.axes2.plot(x, y)
        F1.axes2.set_title("line")
        # 散点图
        F1.axes3 = F1.fig.add_subplot(313)
        F1.axes3.scatter(np.random.rand(20), np.random.rand(20))
        F1.axes3.set_title("scatter")

        self.gridlayout.addWidget(F1, 0, 2)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainDialogImgBW()
    main.show()
    # main.showFullScreen()
    #app.installEventFilter(main)
    sys.exit(app.exec_())

然后运行,即可显示。

改进——图形随窗口进行自动放缩

这是后续的工作,可以不看。

生成的图像不仅可以显示,而且还进行了图形随窗口进行自动放缩

实现方法:

pulsemain.py里再引入包:

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton, QApplication, QHBoxLayout, QVBoxLayout)

gui.py加入(之前的不向该文件加入任何代码,而且最好不向gui.py加入代码;因为如果对.ui文件用external工具再次生成.py文件时,.py文件(这里是gui.py)里加入的代码就被覆盖掉):

python pyqt 主窗口未响应 pyqt界面_子图_04

hbox = QHBoxLayout()
        hbox.addStretch(0) #增加伸缩量
        hbox.addWidget(self.groupBox)
        # hbox.addStretch(1)#增加伸缩量

        self.setLayout(hbox)

即可

展示

python pyqt 主窗口未响应 pyqt界面_python pyqt 主窗口未响应_05


python pyqt 主窗口未响应 pyqt界面_Layout_06


python pyqt 主窗口未响应 pyqt界面_python_07



根据博主这篇博文,可以自己动手完全实现;如果想直接运行或一览源码,可以下载(博主不建议下载,因为可以根据本篇文章彻底实现,本篇文章里即源代码。博主放在下载链接里,仅作为保存)传送门

链接里内容如下,配置好后的pycharm应该可以直接运行(还是不建议大家下载)

python pyqt 主窗口未响应 pyqt界面_子图_08