pythonでプログラミング歴が約2年の者です。まだまだ駆け出しでして、知識豊富な方に助言を頂きたく書き込みをしました。
プログラムの挙動
センサーから0.4sおきに測定結果を収集しており、閾値を超えた場合にアラーム音を鳴らすプログラムです。
質問内容
Qthredを利用し、アラーム音が鳴っている間も、センサーからの測定結果をUIの画面に表示したいのですが、アラーム音が鳴っている間はUIの更新ができません。
いろいろ調べてみたのですが、ノンブロッキング処理や非同期処理を利用するらしいのですが、pyside2のQThredでもこれと似たような方法ができませんでしょうか。
ご存知の経験豊富な先輩方で、方法をご存じの場合には添えていただけませんでしょうか
よろしくお願いいたします。
# リミットスイッチがopenの時間を計測する # プレス機などに設置されているリミットスイッチに利用 # 起動後 Start the Monitoring のボタンを押してプログラムを開始できる # 修了時はExit the Program のボタンを押してプログラムを終了する # 結果は C:\CT.csv に保存されている import sys from PySide2.QtWidgets import * from PySide2.QtCore import QTimer, QObject, Signal, Slot, QThread import time import datetime import csv from playsound import playsound import asyncio import mitutoyo # グローバル関数 経過時間の格納に利用 list_start = [] list_end = [] # csvファイルの保存先 file_path = "c://結果.csv" # リミットスイッチのON/OFFの判定用閾値 threshold = 0.040 sound01 = "D:\0.010.wav" class Main(QWidget): def __init__(self, parent=None): super().__init__(parent) #self.qtthread = None ??? self.initUI() # UIに関する設定 def initUI(self): # プログラムスタートボタン self.btn01 = self.auto_button = QPushButton("開始", self) self.btn01.clicked.connect(self.start_main) self.btn01.move(0, 0) self.btn01.resize(200, 50) # プログラムを閉じるボタン self.btn01 = self.auto_button = QPushButton("停止", self) self.btn01.clicked.connect(self.exit_main) self.btn01.move(0, 50) self.btn01.resize(200, 50) # CTの表示 self.ct_label = QLabel("", self) self.ct_label.move(900, 0) self.ct_label.resize(400, 100) self.style = ("font-size: 128px;") self.ct_label.setStyleSheet(self.style) # Status Barの表示 self.status_bar01 = QLabel("", self) self.status_bar01.move(0, 110) self.status_bar01.resize(2000,2000) self.show() # LCD表示 def lcd(self, aaa): self.value = (str("{}".format(aaa))) self.ct_label.setText(self.value) self.styleA = "QWidget{background-color:%s}" % ("green" if float(self.value) < threshold else "brown") self.status_bar01.setStyleSheet(self.styleA) # 警告音 def sound(self, aaa): self.value = (str("{}".format(aaa))) print(self.value) #self.ct_label.setText(self.background) if "異常発生" in self.value: return elif 0.009 < float(self.value): playsound(sound01) # メインプログラム def start_main(self): # thread処理 class Thread(QThread): send_value = Signal(str) # whileループでGPIO8のシグナルを監視 def run(self): while True: self.value = mitutoyo.mitutoyo() self.send_value.emit(self.value) f = open(file_path, 'a') writer = csv.writer(f, lineterminator='\n') # サイクルタイムの時間を記録 self.dt = datetime.datetime.now() self.dt1 = self.dt.strftime('%Y/%m/%d') self.dt2 = self.dt.strftime('%H:%M:%S') csvlist = [self.dt1, self.dt2, self.value] writer.writerow(csvlist) f.close() time.sleep(0.4) # thread処理+connect thread = self.qtthread = Thread() thread.send_value.connect(self.sound) thread.send_value.connect(self.lcd) thread.start() # exitが押された場合プログラム強制終了 def exit_main(self): sys.exit() if __name__ == '__main__': app = QApplication(sys.argv) #不明。実行には必ず必要 #stylesheetに関する設定 #app.setStyleSheet(style2) main_window = Main() #class Ppf()を表示 main_window.setWindowTitle("歪 アラーム Ver.0.0.1") #windowのtitle #main_window.setFixedSize(300, 200) #ソフトのサイズとサイズの固定 main_window.showMaximized() #ソフトのサイズとサイズの固定 app.exec_() #不明。実行には必ず必要
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/01/09 16:49