You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyQt中从MainWindow类获取变量到MyThread类的run方法中使用

实现方案

核心逻辑为通过线程类构造方法传递参数,同时修正原代码先启动线程再读取参数的逻辑错误(原代码先调用start()再读取界面参数,会导致线程启动时参数未赋值直接报错)。

具体修改点

  • 调整MyThread类的初始化方法,新增三个入参,存为实例属性供run()方法调用
  • 调整buttonClicked执行顺序:先读取界面输入的参数,再实例化线程传入参数、绑定信号,最后启动线程
  • 移除MainWindow初始化方法中预创建线程实例的逻辑,改为每次点击Start按钮时创建新的线程实例(避免QThread重复启动异常)

修改后完整代码

import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5 import QtWidgets
from pyfirmata import Arduino 

board = Arduino("COM6")
Communication_start= "Communication Successfully started"
Communication_close = "Communication Close"
 
class MainWindow(QtWidgets.QMainWindow):    
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.label.setText('目前次數')
        self.ui.pushButton.setText("Start")
        self.ui.pushButton_2.setText("Stop")
        self.ui.lineEdit.setText("1")
        self.ui.label_2.setText("打點次數")
        self.ui.label_3.setText("上升持續時間")
        self.ui.lineEdit_2.setText("1")
        self.ui.lineEdit_3.setText("1")
        self.ui.label_4.setText("下降持續時間")
        self.ui.lineEdit_4.setText(Communication_start)
        self.ui.toolBar.setWindowTitle("toolBar")
        self.ui.pushButton.clicked.connect(self.buttonClicked)
        self.ui.pushButton_2.clicked.connect(self.buttonClicked2)          
                   
    def buttonClicked(self):                     
        # 第一步:先读取所有参数
        count = int(self.ui.lineEdit.text())
        self.count = count
        up_duration = self.ui.lineEdit_2.text()
        down_duration = self.ui.lineEdit_3.text()
        
        # 第二步:创建线程实例,传入参数
        self.my_thread = MyThread(count, up_duration, down_duration)
        self.my_thread.my_signal_1.connect(self.set_lcdNumber_func)
        
        # 第三步:启动线程
        self.my_thread.start()
        
        # 原重新赋值文本逻辑保留
        self.ui.lineEdit.setText(str(count))
        self.ui.lineEdit_2.setText(up_duration)
        self.ui.lineEdit_3.setText(down_duration)        
    
    def buttonClicked2(self):
        self.ui.lineEdit_4.setText(Communication_close)
        # 按需添加停止线程逻辑:self.my_thread.terminate()
        board.exit()
    
    def set_lcdNumber_func(self, num):   
        self.ui.lcdNumber.display(num)     

class MyThread(QThread):   

    my_signal_1 = pyqtSignal(str)       
    
    def __init__(self, count, up_duration, down_duration):
       super(MyThread, self).__init__()  
       # 接收传入的参数,存为实例属性
       self.count = count
       self.up_duration = up_duration
       self.down_duration = down_duration                    
           
    def run(self):       
        for i in range(1, int(self.count)):
            self.my_signal_1.emit(str(i))
            board.digital[8].write(1)
            board.digital[13].write(1)
            time.sleep(float(self.down_duration))
            board.digital[8].write(0)
            board.digital[13].write(0)
            time.sleep(float(self.up_duration))     

内容的提问来源于stack exchange,提问作者CHL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:24:05