前提
Python 3.x
RaspberryPi 3 B
PyQt5
やりたいこと
「GUI上で自動ドアを操作したい」
自動ボタンを押す
①焦電センサでモノを検知
②リードスイッチ2が反応するまでモーターを正転
③モーター停止
④リードスイッチ1が反応するまでモータを逆転
⑤モーター停止
①~⑤がループ
停止ボタンを押す
モーターが停止する
状況
下のようなコードを作成し、自動ボタンを押したところGUIが固まってしまいました。
これについて、「GUIアプリケーションはメインスレッドでイベントループが動いており、while を使うとイベントループが止まってしまうため GUI が動かなくなる」ということを教えていただきました。
また、それを回避するにはサブスレッドを作成して、そこで while を使うといいと教えていただきました。
そこで、私なりに調べてみたところサブスレッドを作るために QThread か QtConcurrent を使うとよいと書かれていました。しかし、使い方がいまいち分かりませんでした。
分からないことが多すぎて、**質問が大枠になってしまいますが QThread か QtConcurrent の使い方をご教授ください。
**
また while を使わなくても、処理をループさせる方法などがあればご教授ください。
無知な私ですがよろしくお願いします。
ただ、現在手元に動作確認できる機材がないため、下のコードがどのように動くか不明です。
python import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * import subprocess import time import numpy as np import cv2 import RPi.GPIO as GPIO Shoden_PIN=22 Motor_PIN_1=24 Motor_PIN_2=25 Reed_PIN_1=17 Reed_PIN_2=27 GPIO.setmode(GPIO.BCM) GPIO.setup(Shoden_PIN, GPIO.IN) GPIO.setup(Reed_PIN_1, GPIO.IN) GPIO.setup(Reed_PIN_2, GPIO.IN) def _init_GPIO(): GPIO.setmode(GPIO.BCM) GPIO.setup(Motor_PIN_1, GPIO.OUT) GPIO.setup(Motor_PIN_2, GPIO.OUT) def Motor_Forward(): _init_GPIO() GPIO.output(Motor_PIN_1, 1) GPIO.output(Motor_PIN_2, 0) def Motor_Backward(): _init_GPIO() GPIO.output(Motor_PIN_1, 0) GPIO.output(Motor_PIN_2, 1) def Motor_Stop(): _init_GPIO() GPIO.output(Motor_PIN_1, 0) GPIO.output(Motor_PIN_2, 0) class Tab1Widget(QWidget): def __init__(self): super().__init__() self.title = "GUI test" self.left = 10 self.top = 10 self.width = 640 self.height = 480 self.initUI() self.counter = 0 def initUI(self): super(Tab1Widget, self).__init__() btn1 = QPushButton("自動", self) btn2 = QPushButton("停止", self) btn1.clicked.connect(self.auto ) btn2.clicked.connect(self.stop ) self.textbox4 = QLineEdit(self) label3 = QLabel("自動ドア") label4 = QLabel("ドアの状態") layoutA = QGridLayout() layoutA.addWidget(label4,0,0) layoutA.addWidget(self.textbox4,0,1) layoutA.addWidget(btn1,1,0) layoutA.addWidget(btn2,1,1) layoutB = QVBoxLayout() layoutB.addWidget(label3) layoutB.addLayout(layoutA) self.setLayout(layoutB) self.show() ''' 焦電センサが物体を検知 モーターが正転 リードスイッチ2が反応 モーター停止 モーターが逆転 リードスイッチ1が反応 モーター停止 ''' def auto(self): if __name__ == '__main__': try: while 1: self.textbox4.setText("CLOSE") if GPIO.input(Shoden_PIN)==GPIO.HIGH: self.textbox4.setText("OPEN") Motor_Forward() while 1: if GPIO.input(Reed_PIN_2)==GPIO.HIGH: GPIO.cleanup() Motor_Stop() time.sleep(1) GPIO.cleanup() Motor_Backward() while 1: if GPIO.input(Reed_PIN_1)==GPIO.HIGH: self.textbox4.setText("CLOSE") GPIO.cleanup() Motor_Stop() GPIO.cleanup() break else: pass break else: pass else: pass except Exception as e: print("Error") finally: GPIO.cleanup() print("GPIO clean") def stop(self): Motor_Stop() GPIO.cleanup() if __name__ == "__main__": app = QApplication(sys.argv) ex = Tab1Widget() sys.exit(app.exec_())
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/25 23:55
2020/06/03 11:48