如何在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
相关产品推荐
相关产品推荐

