Как заставить одновременно работать как графический интерфейс, так и цикл while, содержащий кнопочный переключатель, подключенный через Arduino Uno

#python-3.x #while-loop #arduino-uno #pyside2 #firmata

#python-3.x #цикл while #arduino-uno #pyside2 #firmata

Вопрос:

Я написал код для приложения, которое будет напрямую сравнивать изображения и выдавать выходные данные с помощью Pyside2. Выходные данные будут отображаться в графическом интерфейсе, а также на светодиодах, подключенных через Arduino Uno с использованием Pyfirmata. Теперь я хочу, чтобы моя программа выполнялась как в виртуальном режиме (через кнопку запуска GUI), так и в физическом режиме (через кнопку, подключенную в Arduino Uno. При нажатии на эту кнопку будет выполнена часть кода Run).

Я попытался сделать это, запрограммировав цикл while (который считывает состояние кнопки и выполняет код при каждом нажатии) внутри основного кода Pyside2. Но при выполнении работает только физический режим (через кнопку), и я не могу использовать кнопку запуска графического интерфейса. То есть графический интерфейс выполняет программу при нажатии кнопки, а затем переходит в режим «Не отвечает». Он остается таким до тех пор, пока кнопка не будет нажата снова. Я не могу полностью использовать кнопку запуска графического интерфейса.

Я новичок в Python, Pyside и Pyfirmata. Может ли кто-нибудь, пожалуйста, помочь мне с этим?

Код выглядит примерно так.

 class Ui_xxx(object):
    

    def setupUi(self, xxx):
        content
        self.retranslateUi(xxx)
        QtCore.QMetaObject.connectSlotsByName(xxx)

        self.button1.clicked.connect(self.button1)
        self.button2.clicked.connect(self.button2)
        self.button3.clicked.connect(self.button3)
        self.button4.clicked.connect(self.button4)
        self.say_run.clicked.connect(self.say_run)
  

    def retranslateUi(self, xxx):
        content

    def button1(self):
        content
                
        
    def button2(self):
        content
        
    def button3(self):
        content
        self.say_run()  
        
    def button4(self):
        content

    def say_run(self):
        QtCore.QCoreApplication.processEvents()
        content
        if os.listdir(dir1) == []:
            content
            
        else:   
            content

@goto.with_goto
def main():
    global board
    board = pyfirmata.Arduino('COM3')
    import sys
    app = QtWidgets.QApplication(sys.argv)
    xxx = QtWidgets.QMainWindow()
    ui = Ui_xxx()
    ui.setupUi(xxx)
    xxx.show()
    time.sleep(5)    
    it = pyfirmata.util.Iterator(board)
    it.start()
    digital_input = board.get_pin('d:5:i')
    def ws():
        while True:
            sw = digital_input.read()
            if sw is True:
                board.digital[12].write(1)
                time.sleep(5)
                board.digital[12].write(0)
                time.sleep(5)
                ui.say_run()
                QtCore.QCoreApplication.processEvents()
                break
    
    label .loop101
    ws()
    QtCore.QCoreApplication.processEvents()
    goto .loop101

    board.exit()
    sys.exit(app.exec_())