環境
Python 3.x
RaspberryPi 3 B
PyQt5
やりたいこと
①テキストボックスに「A」、「B」および「C」を出力したいです。
②QThreadを用いたGUIのコードを作りました。おかしな点があれば教えて下さい。
GUIが起動し、自動ボタンを押してもテキストボックス内に文字が出力されません・・・
作成したコード
python
1import sys 2from PyQt5.QtWidgets import * 3from PyQt5.QtGui import * 4from PyQt5.QtCore import * 5import subprocess 6import time 7import numpy as np 8import cv2 9import RPi.GPIO as GPIO 10 11 12 13 14 15class Tab1Widget(QWidget): 16 17 def __init__(self, parent=None): 18 super().__init__(parent) 19 20 self.qt_thread = None 21 self.running = False 22 23 24 self.title = "GUI test" 25 self.left = 10 26 self.top = 10 27 self.width = 640 28 self.height = 480 29 self.initUI() 30 self.counter = 0 31 32 def initUI(self): 33 34 35 super(Tab1Widget, self).__init__() 36 37 38 btn1 = self.auto_button = QPushButton("自動", self) 39 btn2 = self.stop_button = QPushButton("停止", self) 40 41 btn1.clicked.connect(self.auto ) 42 btn2.clicked.connect(self.stop ) 43 44 self.textbox4 = QLineEdit(self) 45 46 47 label3 = QLabel("自動ドア") 48 label4 = QLabel("ドアの状態") 49 50 layoutA = QGridLayout() 51 layoutA.addWidget(label4,0,0) 52 layoutA.addWidget(self.textbox4,0,1) 53 layoutA.addWidget(btn1,1,0) 54 layoutA.addWidget(btn2,1,1) 55 56 layoutB = QVBoxLayout() 57 layoutB.addWidget(label3) 58 layoutB.addLayout(layoutA) 59 60 self.setLayout(layoutB) 61 62 self.show() 63 64 def closeEvent(self, event): 65 self.stop() 66 67 if self.qt_thread: 68 self.qt_thread.wait(2000) # sleep の 1秒以上待つ 69 70 71 super().closeEvent(event) 72 73 def stop(self): 74 75 76 print("cancel") 77 self.running = False 78 79 def setCount(self, alpha): 80 # 呼び出されたスレッドの確認 81 # print("setCount", count, current_thread()) 82 self.textbox4.setText("{}".format(alpha)) 83 84 85 def auto(self): 86 87 win = self 88 win.running = True 89 90 class MyQtThread(QThread): 91 92 sendCount = pyqtSignal(int) 93 sendString = pyqtSignal(str) 94 95 def run(self): 96 x=1 97 while 1: 98 if x==1: 99 alphabet="A" 100 self.sendCount.emit(alphabet) 101 self.sleep(1) 102 x+=1 103 104 elif x==2: 105 alphabet="B" 106 self.sendCount.emit(alphabet) 107 self.sleep(1) 108 x+=1 109 110 111 else: 112 alphabet="C" 113 self.sendCount.emit(alphabet) 114 self.sleep(1) 115 x=x-2 116 117 118 119 120 #for num in range(500): 121 #if not win.running: 122 #break 123 #self.sendCount.emit(num) 124 #self.sleep(1) 125 126 thread = self.qt_thread = MyQtThread() 127 thread.moveToThread(thread) # WRONG! 128 thread.sendString.connect(self.setCount) 129 130 # XXX: スレッドのイベントループが動いてない為、処理されない例 131 # self.stop_button.clicked.connect(thread.terminate) 132 133 # 直接呼び出しは可能(安全ではないかもしれません) 134 terminate = lambda: thread.terminate() 135 self.stop_button.clicked.connect(terminate) 136 137 # 終了時にストップボタンのスロット解除 138 @thread.finished.connect 139 def tear_down(): 140 self.stop_button.clicked.disconnect(terminate) 141 142 thread.start() 143 144 145 146 # self.destroyed.connect(thread.terminate) 147 148if __name__ == "__main__": 149 app = QApplication(sys.argv) 150 ex = Tab1Widget() 151 sys.exit(app.exec_())
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/07 13:52
2020/06/07 14:09
2020/06/07 15:50
2020/06/08 02:26
2020/06/08 02:36
2020/06/08 05:08
2020/06/08 06:46 編集
2020/06/08 07:39
2020/06/08 08:29
2020/06/08 09:18