#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_())