Как получить переменную из главного окна класса в класс Mythread

#python

Вопрос:

Как получить a self.count от a class MainWindow , чтобы Class Mythread выполнить() подсчет

  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)          
         self.my_thread = MyThread()
         self.my_thread.my_signal_1.connect(self.set_lcdNumber_func)
               
        def buttonClicked(self):                     
            self.my_thread.start()
            count = int(self.ui.lineEdit.text())
            self.ui.lineEdit.setText(str(count))
            self.count = int(self.ui.lineEdit.text()) 
            up_duration = self.ui.lineEdit_2.text()
            self.ui.lineEdit_2.setText(up_duration)
            down_duration = self.ui.lineEdit_3.text()
            self.ui.lineEdit_3.setText(down_duration)        
        def buttonClicked2(self):
            self.ui.lineEdit_4.setText(Communication_close)
            board.exit()
        def set_lcdNumber_func(self, num):   
            self.ui.lcdNumber.display(num)     

    class MyThread(QThread):   

    my_signal_1 = pyqtSignal(str)       

        def __init__(self):
           super(MyThread, self).__init__()                       
       
        def run(self):       
            for i in range(1,int(count)):
                self.my_signal_1.emit(str(i))
                board.digital[8].write(1)
                board.digital[13].write(1)
                time.sleep(float(down_duration))
                board.digital[8].write(0)
                board.digital[13].write(0)
                time.sleep(float(up_duration))
 

Комментарии:

1. В вашем коде есть синтаксические ошибки, пожалуйста, убедитесь, что вы правильно отформатировали свой вопрос.

2. Тогда, похоже, проблема здесь на самом деле не в том, «как получить переменную», а в том, «как указать объектно-ориентированную архитектуру, чтобы она делала то, что я хочу». Видите ли, чтобы вы могли «получить доступ» к чему-то изнутри MainWindow MyThread.run() , как оно есть, вам нужно иметь его экземпляр. Самого класса недостаточно, если только вам не нужен статический класс (в чем я сомневаюсь).

3. Пожалуйста, исправьте синтаксические ошибки в вашем вопросе, отступ имеет решающее значение в Python

4. Нет разумного способа предложить ответ, учитывая состояние вопроса. (а) у него есть проблемы с отступами, (б) он не является самодостаточным, так как есть import утверждения, которые необходимы, но не представлены, (в) такие элементы, как board , down_duration , up_duration in MyThread.run() , не определены

Ответ №1:

Вы можете создать геттер/сеттеры для доступа к переменной, а затем получить к ней доступ с помощью этих методов из метода run.

PS: Ваш цикл for не имеет правильного отступа. Все циклы for должны иметь отступы, чтобы Python мог их распознать.

Ответ №2:

Обновить ответ

 class MyThread(QThread): 

my_signal_1 = pyqtSignal(str)       

def __init__(self, window):
    super(MyThread, self).__init__()  
    self.window = window    

def run(self):       
    for i in range(1,int(self.window.count)):
        self.my_signal_1.emit(str(i))
        board.digital[8].write(1)
        board.digital[13].write(1)
        time.sleep(float(down_duration))
        board.digital[8].write(0)
        board.digital[13].write(0)
        time.sleep(float(up_duration)) 
 

=================================================

 class MainWindow(QtWidgets.QMainWindow):
      self.my_thread = MyThread(self)