报错TypeError: MyWindow.text_changed() missing 1 required positional argument: 'current'
我认为是引用current数据的方式有问题,但是不会改。请假如何调整。
text_changed()函数下,图表画两个折线图,当列表我自己定义时可以绘图,但列表引用fun()的结果时就不能得到数据并绘图。
```python
import sys,math
from PySide6.QtWidgets import QApplication, QPushButton, QLineEdit, QWidget,QGridLayout,QLabel,QLayout,QTextEdit
from PySide6.QtCore import QRect, QThread, Signal,QSize,QPointF
from PySide6.QtGui import QFont,QPixmap,Qt,QPainter
from PySide6.QtCharts import QChart,QChartView,QLineSeries,QDateTimeAxis,QValueAxis
from math import *
import serial
import time
class CommunicationThread(QThread): #通信线程
update_signal = Signal(float)
def __init__(self, parent=None):
super().__init__(parent)
self.serial_port = "COM5"
self.serial_baudrate = 9600
self.stop_flag = False
def run(self):
dist_current=[]
ser = serial.Serial(self.serial_port, self.serial_baudrate)
temp_send = '01 03 00 08 00 02 45 c9'
temp_send = bytes.fromhex(temp_send)
while not self.stop_flag:
if ser.is_open:
ser.write(temp_send)
time.sleep(0.5)
buffer_data = ser.in_waiting
if buffer_data:
return_data = ser.read(buffer_data)
return_data_hex = str(return_data.hex())
current =int(return_data_hex[6:10], 16) / 1000 #电流值
dist_current.append(current)
self.update_signal.emit(current)
def stop(self):
self.stop_flag = True
class MyWindow(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle('圆周间隙测试机控制程序')
self.resize(900, 600)
self.setupUi()
self.communication_thread = CommunicationThread()
self.communication_thread.update_signal.connect(self.update_text)
def setupUi(self): #建立界面
#格栅布局
self.gridLayout = QGridLayout(self)
font1=QFont('黑体',pointSize=22)
font2=QFont('黑体',pointSize=15)
font3=QFont('黑体',pointSize=17)
#所有列设置放大1倍-可以最大化列宽成比例放大
self.gridLayout.setColumnStretch(0,1) #设置第1列拉伸时放大1倍
self.gridLayout.setColumnStretch(1,1) #设置第1列拉伸时放大1倍
self.gridLayout.setColumnStretch(2,1) #设置第2列拉伸时放大1倍
self.gridLayout.setColumnStretch(3,1) #设置第4列拉伸时放大1倍
self.gridLayout.setColumnStretch(4,1) #设置第5列拉伸时放大1倍
self.gridLayout.setColumnStretch(5,1) #设置第6列拉伸时放大1倍
self.gridLayout.setColumnStretch(6,1) #设置第7列拉伸时放大1倍
self.gridLayout.setColumnStretch(7,1) #设置第8列拉伸时放大1倍
#所有列设置放大比例,防止13/14行最大化时变大
self.gridLayout.setRowStretch(0,1) #设置第1行拉伸时放大1倍
self.gridLayout.setRowStretch(1,1) #设置第2行拉伸时放大1倍
self.gridLayout.setRowStretch(2,2) #设置第3行拉伸时放大2倍
self.gridLayout.setRowStretch(3,2) #设置第4行拉伸时放大2倍
self.gridLayout.setRowStretch(4,1) #设置第5行拉伸时放大1倍
self.gridLayout.setRowStretch(5,2) #设置第6行拉伸时放大2倍
self.gridLayout.setRowStretch(6,2) #设置第7行拉伸时放大2倍
self.gridLayout.setRowStretch(7,2) #设置第8行拉伸时放大2倍
self.gridLayout.setRowStretch(8,2) #设置第9行拉伸时放大2倍
self.gridLayout.setRowStretch(9,2) #设置第10行拉伸时放大2倍
self.gridLayout.setRowStretch(10,2) #设置第11行拉伸时放大2倍
self.gridLayout.setRowStretch(11,2) #设置第12行拉伸时放大2倍
self.gridLayout.setRowStretch(12,1) #设置第13行拉伸时放大1倍
self.gridLayout.setRowStretch(13,1) #设置第14行拉伸时放大1倍
self.gridLayout.setRowStretch(14,1) #设置第15行拉伸时放大1倍
#建立一个标签标题
self.topLabel=QLabel('圆周间隙测试机控制程序')
self.topLabel.setFont(font1)
self.topLabel.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.topLabel,0,0,1,8)
#试件基本信息
self.info_Label=QLabel('试件基本信息')
self.info_Label.setFont(font2)
self.info_Label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.info_Label,1,0,1,4)
self.pn_label=QLabel('试件编号')
self.pn_label.setFont(font2)
self.pn_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.pn_label,2,0)
self.pn_lineText=QLineEdit(self) #试件编号文本框
self.gridLayout.addWidget(self.pn_lineText,2,1)
self.date_label=QLabel('测试日期')
self.date_label.setFont(font2)
self.date_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.date_label,2,2)
self.pn_lineText=QLineEdit(self) #测试日期文本框-后续改自动生成
self.gridLayout.addWidget(self.pn_lineText,2,3)
self.name_label=QLabel('测试人员')
self.name_label.setFont(font2)
self.name_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.name_label,3,0)
self.name_lineText=QLineEdit(self) #测试人员文本框
self.gridLayout.addWidget(self.name_lineText,3,1)
self.rp_label=QLabel('报告编号')
self.rp_label.setFont(font2)
self.rp_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.rp_label,3,2)
self.rp_lineText=QLineEdit(self) #测试报告文本框
self.gridLayout.addWidget(self.rp_lineText,3,3)
self.input_label=QLabel('输入位移曲线坐标')
self.input_label.setFont(font2)
self.input_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.input_label,4,0,1,4)
self.x1_label=QLabel('X1坐标')
self.x1_label.setFont(font2)
self.x1_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x1_label,5,0)
self.x1_lineText=QLineEdit('0') #x1坐标文本框
self.gridLayout.addWidget(self.x1_lineText,5,1)
self.x1_lineText.textChanged.connect(self.text_changed)
self.y1_label=QLabel('Y1坐标')
self.y1_label.setFont(font2)
self.y1_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y1_label,5,2)
self.y1_lineText=QLineEdit('0') #y1坐标文本框
self.gridLayout.addWidget(self.y1_lineText,5,3)
self.y1_lineText.textChanged.connect(self.text_changed)
self.x2_label=QLabel('X2坐标')
self.x2_label.setFont(font2)
self.x2_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x2_label,6,0)
self.x2_lineText=QLineEdit('0') #x2坐标文本框
self.gridLayout.addWidget(self.x2_lineText,6,1)
self.x2_lineText.textChanged.connect(self.text_changed)
self.y2_label=QLabel('Y2坐标')
self.y2_label.setFont(font2)
self.y2_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y2_label,6,2)
self.y2_lineText=QLineEdit('0') #y2坐标文本框
self.gridLayout.addWidget(self.y2_lineText,6,3)
self.y2_lineText.textChanged.connect(self.text_changed)
self.x3_label=QLabel('X3坐标')
self.x3_label.setFont(font2)
self.x3_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x3_label,7,0)
self.x3_lineText=QLineEdit('0') #x3坐标文本框
self.gridLayout.addWidget(self.x3_lineText,7,1)
self.x3_lineText.textChanged.connect(self.text_changed)
self.y3_label=QLabel('Y3坐标')
self.y3_label.setFont(font2)
self.y3_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y3_label,7,2)
self.y3_lineText=QLineEdit('0') #y3坐标文本框
self.gridLayout.addWidget(self.y3_lineText,7,3)
self.y3_lineText.textChanged.connect(self.text_changed)
self.x4_label=QLabel('X4坐标')
self.x4_label.setFont(font2)
self.x4_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x4_label,8,0)
self.x4_lineText=QLineEdit('0') #x4坐标文本框
self.gridLayout.addWidget(self.x4_lineText,8,1)
self.x4_lineText.textChanged.connect(self.text_changed)
self.y4_label=QLabel('Y4坐标')
self.y4_label.setFont(font2)
self.y4_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y4_label,8,2)
self.y4_lineText=QLineEdit('0') #y4坐标文本框
self.gridLayout.addWidget(self.y4_lineText,8,3)
self.y4_lineText.textChanged.connect(self.text_changed)
self.x5_label=QLabel('X5坐标')
self.x5_label.setFont(font2)
self.x5_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x5_label,9,0)
self.x5_lineText=QLineEdit('0') #x5坐标文本框
self.gridLayout.addWidget(self.x5_lineText,9,1)
self.x5_lineText.textChanged.connect(self.text_changed)
self.y5_label=QLabel('Y5坐标')
self.y5_label.setFont(font2)
self.y5_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y5_label,9,2)
self.y5_lineText=QLineEdit('0') #y5坐标文本框
self.gridLayout.addWidget(self.y5_lineText,9,3)
self.y5_lineText.textChanged.connect(self.text_changed)
self.x6_label=QLabel('X6坐标')
self.x6_label.setFont(font2)
self.x6_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.x6_label,10,0)
self.x6_lineText=QLineEdit('0') #x6坐标文本框
self.gridLayout.addWidget(self.x6_lineText,10,1)
self.x6_lineText.textChanged.connect(self.text_changed)
self.y6_label=QLabel('Y6坐标')
self.y6_label.setFont(font2)
self.y6_label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.y6_label,10,2)
self.y6_lineText=QLineEdit('0') #x1坐标文本框
self.gridLayout.addWidget(self.y6_lineText,10,3)
self.y6_lineText.textChanged.connect(self.text_changed)
#位移摆角曲线列
self.curve_Label=QLabel('位移摆角曲线')
self.curve_Label.setFont(font2)
self.curve_Label.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.curve_Label,1,4,1,4)
# 创建空的曲线表视图
chart_view=QChartView()
chart_view.setRenderHint(QPainter.Antialiasing) # 抗锯齿
self.gridLayout.addWidget(chart_view,2,4,9,4)
chart=QChart() #创建图表
chart_view.setChart(chart) #图表控件中添加图表
series_dc=QLineSeries() #创建空的折线数据序列
#设置空的坐标要素
axis_x = QValueAxis() #创建空的坐标轴
axis_x.setRange(-50,50) #设置空的坐标轴的范围
axis_x.setTitleText("mm") #设置空的坐标轴的标题
chart.addAxis(axis_x,Qt.AlignBottom) # 添加X轴到图表,位置为底部
#series_dc.attachAxis(axis_x) # 初始空表,所以数据序列赞不与X轴关联
axis_y = QValueAxis()
axis_y.setRange(0,50)
axis_y.setTitleText("deg")
chart.addAxis(axis_y,Qt.AlignLeft) # 添加Y轴到图表,位置为左侧
#series_dc.attachAxis(axis_x) # 初始空表,所以数据序列赞不与Y轴关联
#动态数据框-显示机器动态X轴位移数据
self.x_textedit=QTextEdit(self)
self.gridLayout.addWidget(self.x_textedit,12,0,1,8)
self.x_textedit.setReadOnly(True) #设置文本框只读
self.x_textedit.textChanged.connect(self.text_changed) #动态数据连接曲线函数
#动态数据框-显示机器动态Y轴角度数据
self.y_textedit=QTextEdit(self)
self.gridLayout.addWidget(self.y_textedit,13,0,1,8)
self.y_textedit.setReadOnly(True) #设置只读
self.x_textedit.textChanged.connect(self.text_changed) #动态数据连接曲线函数
#操作指令
self.off_button = QPushButton(self)
self.off_button.setText('已经启动')#启动和关闭机器按钮
self.off_button.setFont(font3)
self.gridLayout.addWidget(self.off_button,11,0)
self.ex_button = QPushButton(self)
self.ex_button.setText('往外拉伸')
self.ex_button.setFont(font3)
self.gridLayout.addWidget(self.ex_button,11,1)
self.cm_button = QPushButton(self)
self.cm_button.setText('往内压缩')
self.cm_button.setFont(font3)
self.gridLayout.addWidget(self.cm_button,11,2)
self.start_button = QPushButton(self)
self.start_button.setText('开始测试')
self.start_button.setFont(font3)
self.gridLayout.addWidget(self.start_button,11,3)
self.end_button = QPushButton(self)
self.end_button.setText('结束测试')
self.end_button.setFont(font3)
self.gridLayout.addWidget(self.end_button,11,4)
self.clear_button = QPushButton(self)
self.clear_button.setText('卸除载荷')
self.clear_button.setFont(font3)
self.gridLayout.addWidget(self.clear_button,11,5)
self.rp_button = QPushButton(self)
self.rp_button.setText('生成报告')
self.rp_button.setFont(font3)
self.gridLayout.addWidget(self.rp_button,11,6)
self.exit_button = QPushButton(self)
self.exit_button.setText('退出程序')
self.exit_button.setFont(font3)
self.gridLayout.addWidget(self.exit_button,11,7)
#页脚
self.company_lable = QLabel(self)
self.company_lable.setText('宁波禄腾传动有限公司@2019-2023版权所有 请勿拷贝')
self.company_lable.setFont(font2)
self.company_lable.setAlignment(Qt.AlignCenter|Qt.AlignVCenter)
self.gridLayout.addWidget(self.company_lable,14,0,1,8)
self.start_button.clicked.connect(self.start_communication) #开始测试按钮连接启动通信槽函数
#坐标文本框改变时曲线跟随变化
def text_changed(self,current):
# 创建设计的位移摆角曲线表视图
chart_view=QChartView()
chart_view.setRenderHint(QPainter.Antialiasing) # 抗锯齿
self.gridLayout.addWidget(chart_view,2,4,9,4)
chart=QChart() #创建图表
chart_view.setChart(chart) #图表控件中添加图表
series_dc=QLineSeries() #创建设计的折线数据序列
series_ac=QLineSeries() #创建实际的折线数据序列
series_dc.setName('设计曲线') #m数据序列名称
series_ac.setName('实际曲线') #数据序列名称
#设计的位移曲线
#输入后的点坐标
x1=float(self.x1_lineText.text())
y1=float(self.y1_lineText.text())
x2=float(self.x2_lineText.text())
y2=float(self.y2_lineText.text())
x3=float(self.x3_lineText.text())
y3=float(self.y3_lineText.text())
x4=float(self.x4_lineText.text())
y4=float(self.y4_lineText.text())
x5=float(self.x5_lineText.text())
y5=float(self.y5_lineText.text())
x6=float(self.x6_lineText.text())
y6=float(self.y6_lineText.text())
xn = []
yn = []
xn.append(current)
yn.append(current)
#设置坐标要素并绘图设计曲线
series_dc.append([QPointF(x1,y1),QPointF(x2,y2),QPointF(x3,y3),QPointF(x4,y4),QPointF(x5,y5),QPointF(x6,y6)])#数据序列中添加数据
for x, y in zip(xn, yn):
series_ac.append(QPointF(float(x), float(y)))
chart.addSeries(series_dc) #图表中添加设计数据序列
chart.addSeries(series_ac) #图表中添加实际数据序列
axis_x = QValueAxis() #创建Y坐标轴
axis_x.setRange(-40,40) #设置坐标轴的范围
axis_x.setTitleText("mm") #设置坐标轴的标题
chart.addAxis(axis_x,Qt.AlignBottom) # 添加X轴到图表,位置为底部
chart.setAxisX(axis_x, series_dc) # 将设计数据序列与x轴关联
chart.setAxisX(axis_x, series_ac) # 将实际数据序列与x轴关联
axis_y = QValueAxis() ##创建Y坐标轴
axis_y.setRange(0,50)
axis_y.setTitleText("deg")
chart.addAxis(axis_y,Qt.AlignLeft) # 添加Y轴到图表,位置为左侧
series_dc.attachAxis(axis_y) # 将设计数据序列与y轴关联
series_ac.attachAxis(axis_y) # 将实际数据序列与y轴关联
def start_communication(self): #线程之启动通信函数
self.communication_thread.start()
def update_text(self, current):
self.x_textedit.insertPlainText('{:.4f}'.format(current))
self.y_textedit.insertPlainText('{:.4f}'.format(current))
def closeEvent(self, event):
self.communication_thread.stop()
self.communication_thread.wait()
super().closeEvent(event)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
```