学期末要做微波技术课设,老师要求设计一个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 就会绘制这点的等反射系数圆、阻抗实部圆、阻抗虚部圆: