multicoreprocessingを使用して、計測機器から結果を取得しUIに表示するプログラムを作成しております。2日間苦労し、なんとか表示できないかとコードを改定おりますがどうしてもわからないため、質問をいたしました。
質問内容
PySideのQLabelの内容を動的に変更したのですが、multicoreprocessingのため、動的に変更できず、pickleという方法を利用することにより、変更可能であるとの情報を見つけました。ネットを探しましたが詳しいやり方が乗っておらず、どうしたものかと思い質問いたしました、ご存じの方おりましたら、教えていただきませんでしょうか。
エラー内容
Process Process-2:
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 297, in _bootstrap
self.run()
File "C:\Users\user\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "D:\Hiroshi\Program\Mitutoyo\test005.py", line 98, in lcd
self.ct_label.setText(q.get())
AttributeError: 'Main' object has no attribute 'ct_label'
# リミットスイッチがopenの時間を計測する # プレス機などに設置されているリミットスイッチに利用 # 起動後 Start the Monitoring のボタンを押してプログラムを開始できる # 修了時はExit the Program のボタンを押してプログラムを終了する # 結果は C:\CT.csv に保存されている from multiprocessing import Queue, Process, freeze_support import sys from PySide6.QtWidgets import * from PySide6 import QtWidgets from PySide6.QtWidgets import QApplication, QLabel from PySide2.QtCore import QTimer, QObject, Signal, Slot, QThread, QTimer import time import datetime import csv from playsound import playsound from mitutoyo import mitutoyo import signal from multiprocessing import pool import dill import pickle # リミットスイッチのON/OFFの判定用閾値 threshold = 0.030 sound01 = "D:\DEFAULT.ACER\Programing\PycharmProjects\Mitutoyo\dial-guage\sound\0.010.wav" class Main(QtWidgets.QLabel): def __setstate__(self, state): """非 Pickle 化されるとき呼ばれる""" # オブジェクトの持つ属性を復元する self.__dict__.update(state) def __getstate__(self): """Pickle 化されるとき呼ばれる""" # オブジェクトの持つ属性をコピーする self.__dict__.copy() def __init__(self, parent=None): super().__init__(parent) self.initUI() #self.setText("sdsdsdsdsdsdsds") def initUI(self): # プログラムスタートボタン self.btn01 = self.auto_button = QPushButton("開始", self) self.btn01.clicked.connect(self.start) 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.ct_label.move(300, 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) def start(self): main = Main() q = Queue() p0 = Process(target = main.loop, args=(q,)) p1 = Process(target = main.lcd, args=(q,)) p2 = Process(target = main.alarm, args=(q,)) p0.start() p1.start() p2.start() # whileループでミツトヨからのデータを取得し、LCDの表示と色の変更 def loop(self, q): while True: self.value = mitutoyo() q.put(self.value) # exitが押された場合プログラム強制終了 def exit_main(self, q): sys.exit() # LCD表示 def lcd(self, q,): while True: self.ct_label.setText(q.get()) #このぶぶんでエラーが発生してしまいます。# #print(self.value) #self.styleA = "QWidget{background-color:%s}" % ("green" if float(self.value) < threshold else "brown") #self.status_bar01.setStyleSheet(self.styleA) # 警告音 ok def alarm(self, q): while True: if float(q.get()) > 0.010: print("sdsdsdsdwsdwdw") #playsound(sound01) if __name__ == '__main__': freeze_support() app = QApplication(sys.argv) #不明。実行には必ず必要 main_window = Main() #class Ppf()を表示 main_window.setWindowTitle("歪 アラーム Ver.0.0.1") #windowのtitle main_window.setFixedSize(600, 600) #ソフトのサイズとサイズの固定 #main_window.showMaximized() #ソフトのサイズとサイズの固定 main_window.show() app.exec_() #不明。実行には必ず必要
あなたの回答
tips
プレビュー