微波课设 基于pyqt5+pyqtgraph的Smith圆图GUI程序设计

学期末要做微波技术课设,老师要求设计一个GUI,和Smith圆图有关

然后选用python里面的pyqt5设计出一个交互界面。

思路很简单就是先用qtdesigner搭建框架生成python代码,再把python代码改改就ok

画图本来想用matplotlib,但是这个库交互性没有pyqtgraph强,所以画图用了pyqtgraph。

pyqtgraph库里面的十字光标参考了https://zmister.com/archives/793.html

但是链接里面文章不能拿来直接跑:(这句话有问题)

if self.k_plt.sceneBoundingRect().contains(pos):

 绘制Smith圆图也很简单,两个圆的方程用极坐标就ok了(还是有一些bug)

不多废话直接上代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication,QMainWindow
import sys
import numpy as np
import pyqtgraph as pg
import math

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(900, 700)
        MainWindow.setMinimumSize(QtCore.QSize(20, 20))
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(70, 50, 91, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.comboBox = QtWidgets.QComboBox(self.verticalLayoutWidget)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.verticalLayout.addWidget(self.comboBox)
        self.comboBox_2 = QtWidgets.QComboBox(self.verticalLayoutWidget)
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.verticalLayout.addWidget(self.comboBox_2)
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(70, 200, 91, 31))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(40, 260, 171, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.plot_blue)
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(30, 620, 101, 23))
        self.pushButton_5.setObjectName("pushButton_5")
        self.lineEdit_7 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_7.setGeometry(QtCore.QRect(140, 620, 111, 20))
        self.lineEdit_7.setObjectName("lineEdit_7")
        self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_6.setGeometry(QtCore.QRect(280, 620, 101, 23))
        self.pushButton_6.setObjectName("pushButton_6")
        self.lineEdit_8 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_8.setGeometry(QtCore.QRect(390, 620, 111, 20))
        self.lineEdit_8.setObjectName("lineEdit_8")
        self.pushButton_7 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_7.setGeometry(QtCore.QRect(530, 620, 111, 23))
        self.pushButton_7.setObjectName("pushButton_7")
        self.lineEdit_9 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_9.setGeometry(QtCore.QRect(650, 620, 111, 20))
        self.lineEdit_9.setObjectName("lineEdit_9")
        self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QtCore.QRect(30, 530, 752, 81))
        self.layoutWidget.setObjectName("layoutWidget")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.label_2 = QtWidgets.QLabel(self.layoutWidget)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 2, 1, 1)
        self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.gridLayout.addWidget(self.lineEdit_2, 1, 2, 1, 1)
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 0, 3, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
        self.pushButton_2.setSizePolicy(sizePolicy)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 0, 0, 2, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 1, 3, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.layoutWidget)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 1, 1, 1)
        self.horizontalLayout_2.addLayout(self.gridLayout)
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.gridLayout_2.addWidget(self.lineEdit_3, 0, 2, 1, 1)
        self.lineEdit_4 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.gridLayout_2.addWidget(self.lineEdit_4, 1, 2, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem2, 1, 3, 1, 1)
        self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.gridLayout_2.addWidget(self.pushButton_3, 0, 0, 2, 1)
        self.label_5 = QtWidgets.QLabel(self.layoutWidget)
        self.label_5.setObjectName("label_5")
        self.gridLayout_2.addWidget(self.label_5, 1, 1, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.layoutWidget)
        self.label_4.setObjectName("label_4")
        self.gridLayout_2.addWidget(self.label_4, 0, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem3, 0, 3, 1, 1)
        self.horizontalLayout_2.addLayout(self.gridLayout_2)
        self.gridLayout_3 = QtWidgets.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.lineEdit_6 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_6.setObjectName("lineEdit_6")
        self.gridLayout_3.addWidget(self.lineEdit_6, 1, 2, 1, 1)
        self.lineEdit_5 = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.gridLayout_3.addWidget(self.lineEdit_5, 0, 2, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.layoutWidget)
        self.label_6.setObjectName("label_6")
        self.gridLayout_3.addWidget(self.label_6, 0, 1, 1, 1)
        self.label_7 = QtWidgets.QLabel(self.layoutWidget)
        self.label_7.setObjectName("label_7")
        self.gridLayout_3.addWidget(self.label_7, 1, 1, 1, 1)
        self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.gridLayout_3.addWidget(self.pushButton_4, 0, 0, 2, 1)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem4, 0, 3, 1, 1)
        spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_3.addItem(spacerItem5, 1, 3, 1, 1)
        self.horizontalLayout_2.addLayout(self.gridLayout_3)
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(783, 200, 81, 31))
        self.label_8.setObjectName("label_8")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(770, 230, 111, 20))
        self.label_9.setObjectName("label_9")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(750, 260, 151, 16))
        self.label_10.setObjectName("label_10")
        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(750, 280, 151, 20))
        self.label_11.setObjectName("label_11")
        self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(219, 59, 463, 450))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.plot = pg.PlotWidget()
        self.plot_cricle()
        self.labela = pg.TextItem()  # 创建一个文本项
        self.plot.addItem(self.labela)
        self.vLine = pg.InfiniteLine(angle=90, movable=False, )  # 创建一个垂直线条
        self.hLine = pg.InfiniteLine(angle=0, movable=False, )  # 创建一个水平线条
        self.plot.addItem(self.vLine, ignoreBounds=True)  # 在图形部件中添加垂直线条
        self.plot.addItem(self.hLine, ignoreBounds=True)  # 在图形部件中添加水平线条
        self.gridLayout_4.addWidget(self.plot)
        self.move_slot = pg.SignalProxy(self.plot.scene().sigMouseMoved, rateLimit=60, slot=self.print_plot)
        self.click_slot = pg.SignalProxy(self.plot.scene().sigMouseClicked,rateLimit=60,slot = self.click_plot)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Smith圆图"))
        self.comboBox.setItemText(0, _translate("MainWindow", "作者"))
        self.comboBox.setItemText(1, _translate("MainWindow", "吴修文"))
        self.comboBox_2.setItemText(0, _translate("MainWindow", "时间"))
        self.comboBox_2.setItemText(1, _translate("MainWindow", "2019/12/25"))
        self.label.setText(_translate("MainWindow", "Smith圆图测试器"))
        self.pushButton.setText(_translate("MainWindow", "Get a point please (#^.^#)"))
        self.pushButton_5.setText(_translate("MainWindow", "驻波比"))
        self.pushButton_6.setText(_translate("MainWindow", "行波系数"))
        self.pushButton_7.setText(_translate("MainWindow", "波腹、波节点判断"))
        self.label_2.setText(_translate("MainWindow", "实部"))
        self.pushButton_2.setText(_translate("MainWindow", "阻抗值"))
        self.label_3.setText(_translate("MainWindow", "虚部"))
        self.pushButton_3.setText(_translate("MainWindow", "导纳值"))
        self.label_5.setText(_translate("MainWindow", "虚部"))
        self.label_4.setText(_translate("MainWindow", "实部"))
        self.label_6.setText(_translate("MainWindow", "实部"))
        self.label_7.setText(_translate("MainWindow", "虚部"))
        self.pushButton_4.setText(_translate("MainWindow", "反射系数"))
        self.label_8.setText(_translate("MainWindow", "黄色:单位圆"))
        self.label_9.setText(_translate("MainWindow", "红色:等反射系数圆"))
        self.label_10.setText(_translate("MainWindow", "绿色:阻抗或导纳实部圆"))
        self.label_11.setText(_translate("MainWindow", "蓝色:阻抗或导纳虚部圆"))
        
    def print_plot(self,event = None):
        if event is None:
            print("事件为空")
        else:
            pos = event[0]
            mousePoint = self.plot.plotItem.vb.mapSceneToView(pos)
            pos_x = mousePoint.x()
            pos_y = mousePoint.y()

            if (pos_x * pos_x + pos_y *pos_y) < 1 or (pos_x * pos_x + pos_y *pos_y) ==1 :
                x_p = mousePoint.x()
                y_p = mousePoint.y()
                rrrrr = (1 - x_p ** 2 - y_p ** 2) / ((1 - x_p) * (1 - x_p) + y_p**2)
                xxxxx = (2 * y_p) / ((1 - x_p) * (1 - x_p) + y_p**2)
                ppppp = rrrrr ** 2 + xxxxx ** 2
                ggggg = rrrrr / ppppp
                bbbbb = -1 * xxxxx / ppppp
                self.real_part = format(rrrrr, '.5g')
                self.imaginary_part = format(xxxxx, '.5f')
                self.g_real = format(ggggg, '.5f')
                self.g_imag = format(bbbbb, '.5f')
                self.f_real = format(x_p,'.5f')
                self.f_imag = format(y_p, '.5f')
                qqqqqq = math.sqrt(x_p **2 + y_p ** 2)
                vswr = (1+qqqqqq)/(1-qqqqqq)
                self.vswr = format(vswr,'.5f')
                self.k = format(1/vswr,'.5f')
                self.x = format(x_p,'.5f')
                self.y = format(y_p,'.5f')
                if (self.x == -1.0 and self.y == 0.0):
                    self.string1 = '这是一个波节点'
                elif (self.x == 1.0 and self.y == 0.0):
                    self.string1 = '这是一个波腹点'
                elif (self.x == 0.0 and self.y == 0.0):
                    self.string1 = '这个一个阻抗匹配点'
                else:
                    self.string1 = '这是一个普通点'

                self.labela.setHtml(
                    "<p style='color:white'><strong>阻抗值</strong></p><p style='color:white'>实部:{0}</p><p style='color:white'>虚部:{1}".format(
                        self.real_part, self.imaginary_part))
                self.labela.setPos(mousePoint.x(), mousePoint.y())
            else :

                self.real_part = None
                self.imaginary_part = None
                self.g_real = None
                self.g_imag = None
                self.f_imag = None
                self.f_real = None

                self.labela.setHtml(
                    "<p style='color:white'><strong>阻抗值</strong></p><p style='color:white'>实部:{0}</p><p style='color:white'>虚部:{1}".format(
                        None,None))
                self.labela.setPos(mousePoint.x(), mousePoint.y())
            self.vLine.setPos(mousePoint.x())
            self.hLine.setPos(mousePoint.y())

    def click_plot(self,event = None):
        if event is None:
            print('事件为空')
        else:
            aaa = self.real_part
            bbb = self.imaginary_part
            self.lineEdit.setText(str(aaa))
            self.lineEdit_2.setText(str(bbb))
            self.lineEdit_3.setText(str(self.g_real))
            self.lineEdit_4.setText(str(self.g_imag))
            self.lineEdit_5.setText(str(self.f_real))
            self.lineEdit_6.setText(str(self.f_imag))
            self.lineEdit_7.setText(str(self.vswr))
            self.lineEdit_8.setText(str(self.k))
            self.string1 = '这是一个普通点'
            self.lineEdit_9.setText(self.string1)
    def plot_cricle(self):
        r = np.array([0.0, 0.05, 0.1, 0.2, 0.3, 0.5, 1, 1.5, 2, 3, 10, 100, 150, 200], dtype=float)
        thrata = np.arange(0, 2 * np.pi, 0.01)
        x = np.zeros([r.shape[0], thrata.shape[0]])
        y = np.zeros([r.shape[0], thrata.shape[0]])
        b = 0.0
        k = 0
        for ii in r:
            a = ii / (1 + ii)
            R = 1 / (1 + ii)
            x[k, :] = a + R * np.cos(thrata)
            y[k, :] = b + R * np.sin(thrata)
            self.plot.plot(x[k, :], y[k, :], color='w')
            k = k + 1
        xx1 = np.arange(-5, 5.5, 0.2)
        np.delete(xx1, 10)
        for jj in xx1:
            RR = abs(1 / jj)
            b = 1 / jj
            xx = 1 + RR * np.cos(thrata)
            yy = b + RR * np.sin(thrata)
            ddx = []
            ddy = []
            for m, n in zip(xx, yy):
                if (n * n + m * m) < 1:
                    ddx.append(m)
                    ddy.append(n)
            self.plot.plot(ddx, ddy, color='w')
        xxx11 = np.cos(thrata)
        yyy11 = np.sin(thrata)
        self.plot.plot().setData(xxx11, yyy11, pen='y')

    def plot_blue(self):
        self.plot.clear()
        self.labela = pg.TextItem()  # 创建一个文本项
        self.plot.addItem(self.labela)
        self.vLine = pg.InfiniteLine(angle=90, movable=False, )  # 创建一个垂直线条
        self.hLine = pg.InfiniteLine(angle=0, movable=False, )  # 创建一个水平线条
        self.plot.addItem(self.vLine, ignoreBounds=True)  # 在图形部件中添加垂直线条
        self.plot.addItem(self.hLine, ignoreBounds=True)  # 在图形部件中添加水平线条
        self.plot_cricle()


        r = float(self.lineEdit.text())
        x = float(self.lineEdit_2.text())
        x_p = float(self.lineEdit_5.text())
        y_p = float(self.lineEdit_6.text())
        print(x_p)
        print(y_p)
        thrata = np.arange(0, 2 * np.pi, 0.01)
        a = r/(1+r)
        R = abs(1/(1+r))
        xx = a + R * np.cos(thrata)
        yy = R * np.sin(thrata)
        self.plot.plot(xx,yy, pen = 'g')

        RR = 1/x
        xxx = 1+ abs(RR)*np.cos(thrata)
        yyy = RR + abs(RR) * np.sin(thrata)
        ddx = []
        ddy = []
        for m, n in zip(xxx, yyy):
            if (n * n + m * m) < 1:
                ddx.append(m)
                ddy.append(n)
        self.plot.plot(ddx, ddy, pen='b')

        RRR = math.sqrt(x_p**2 + y_p **2)
        xxxx = RRR * np.cos(thrata)
        yyyy = RRR * np.sin(thrata)
        self.plot.plot().setData(xxxx,yyyy,pen = 'r')
        if x_p == 1 and y_p == 0:
            self.aa()
            self.string1 = '这是一个匹配点'

        if (x_p == -1.0 and y_p == 0.0):
            self.aa()
            self.string1 = '这是一个波节点'
        elif (x_p == 1.0 and y_p == 0.0):
            self.string1 = '这是一个波腹点'
        elif (x_p == 0.0 and y_p == 0.0):
            self.aa()
            self.string1 = '这个一个阻抗匹配点'
        else:

            self.string1 = '这是一个普通点'
        self.lineEdit_9.setText(self.string1)

    def aa(self):
        self.plot.clear()
        self.labela = pg.TextItem()  # 创建一个文本项
        self.plot.addItem(self.labela)
        self.vLine = pg.InfiniteLine(angle=90, movable=False, )  # 创建一个垂直线条
        self.hLine = pg.InfiniteLine(angle=0, movable=False, )  # 创建一个水平线条
        self.plot.addItem(self.vLine, ignoreBounds=True)  # 在图形部件中添加垂直线条
        self.plot.addItem(self.hLine, ignoreBounds=True)  # 在图形部件中添加水平线条
        self.plot_cricle()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    Mainwindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(Mainwindow)
    Mainwindow.show()
    sys.exit(app.exec_())

界面:

 点击会在下面出现这个点对应的数值:

 下面如果有数值时候点击get a point please 就会绘制这点的等反射系数圆、阻抗实部圆、阻抗虚部圆:

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值