如何将MainWindow类的self.count变量传递到MyThread类的run()方法中
解决方案
核心逻辑是将需要的参数传递到MyThread实例中存储,再在run方法里调用实例属性即可,具体修改如下:
步骤1:修改MyThread类,增加参数接收逻辑
给__init__方法添加参数入参,将参数保存为实例属性,方便run方法调用:
class MyThread(QThread): my_signal_1 = pyqtSignal(str) # 增加count、上升时长、下降时长三个参数接收 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))
步骤2:修改MainWindow中的线程启动逻辑
原有代码存在逻辑顺序错误:先启动线程再读取参数,会导致线程启动后参数还没传递直接报错,需要调整为「先读参数→再给线程传参→最后启动线程」,推荐以下实现方式:
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) # 这里不需要提前实例化线程,点击Start时再创建即可 def buttonClicked(self): # 1. 先读取所有配置参数 count = int(self.ui.lineEdit.text()) self.count = count up_duration = self.ui.lineEdit_2.text() down_duration = self.ui.lineEdit_3.text() # 2. 将参数传入线程实例初始化 self.my_thread = MyThread(count, up_duration, down_duration) self.my_thread.my_signal_1.connect(self.set_lcdNumber_func) # 3. 最后启动线程 self.my_thread.start() def buttonClicked2(self): self.ui.lineEdit_4.setText(Communication_close) board.exit() def set_lcdNumber_func(self, num): self.ui.lcdNumber.display(num)
内容的提问来源于stack exchange,提问作者CHL
相关产品推荐
相关产品推荐

