gfdncs 2023-11-12 09:17 采纳率: 50%
浏览 4

如何一个函数引用另一个函数的列表结果

报错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())

```

  • 写回答

3条回答 默认 最新

  • 木头人123。 2023-11-12 10:22
    关注

    报错的原因是text_changed函数需要一个参数current,但在self.x_textedit.textChanged.connect(self.text_changed)这个连接中,没有传递current参数。

    在这个例子中,我们可以修改text_changed函数,不需要传递current参数,因为我们可以从输入框中直接获取对应的值。请参考以下修改后的代码:

    # 将函数定义从 def text_changed(self, current): 修改为如下:
    def text_changed(self):
        # ... 其他代码不变 ...
    
    # 将以下四行代码注释掉,因为我们不需要传递 current 参数:
    # self.x1_lineText.textChanged.connect(self.text_changed)
    # self.y1_lineText.textChanged.connect(self.text_changed)
    # self.x2_lineText.textChanged.connect(self.text_changed)
    # self.y2_lineText.textChanged.connect(self.text_changed)
    # self.x3_lineText.textChanged.connect(self.text_changed)
    # self.y3_lineText.textChanged.connect(self.text_changed)
    # self.x4_lineText.textChanged.connect(self.text_changed)
    # self.y4_lineText.textChanged.connect(self.text_changed)
    # self.x5_lineText.textChanged.connect(self.text_changed)
    # self.y5_lineText.textChanged.connect(self.text_changed)
    # self.x6_lineText.textChanged.connect(self.text_changed)
    # self.y6_lineText.textChanged.connect(self.text_changed)
    
    # 将以下四行代码添加到相应位置,用于在输入框的文本改变时调用 text_changed 函数:
    self.x1_lineText.textChanged.connect(self.text_changed)
    self.y1_lineText.textChanged.connect(self.text_changed)
    self.x2_lineText.textChanged.connect(self.text_changed)
    self.y2_lineText.textChanged.connect(self.text_changed)
    self.x3_lineText.textChanged.connect(self.text_changed)
    self.y3_lineText.textChanged.connect(self.text_changed)
    self.x4_lineText.textChanged.connect(self.text_changed)
    self.y4_lineText.textChanged.connect(self.text_changed)
    self.x5_lineText.textChanged.connect(self.text_changed)
    self.y5_lineText.textChanged.connect(self.text_changed)
    self.x6_lineText.textChanged.connect(self.text_changed)
    self.y6_lineText.textChanged.connect(self.text_changed)
    

    这样修改后,当输入框的文本发生变化时,text_changed函数会被调用,而不会报错缺少参数。

    评论

报告相同问题?

问题事件

  • 修改了问题 11月12日
  • 创建了问题 11月12日