首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多核后处理QLabel动态更改pyqt setText的内容

如何使用多核后处理QLabel动态更改pyqt setText的内容
EN

Stack Overflow用户
提问于 2022-01-09 17:04:32
回答 1查看 218关注 0票数 -3

我正在尝试创建一个程序来获取测量设备的结果,并使用多核处理将它们显示在UI上。两天的努力工作,我试图修改代码,看看我是否可以显示结果,但我无法弄清楚,所以我问了这个问题。我的问题是我想动态地更改PySide的QLabel的内容,但是由于多核后处理,我不能动态地更改它。我在网上搜索过,但是没有关于如何做到这一点的详细信息,所以我问了这个问题。

错误描述

代码语言:javascript
复制
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
代码语言:javascript
复制
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

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_() #不明。実行には必ず必要
EN

回答 1

Stack Overflow用户

发布于 2022-01-09 17:29:51

如何使用(Py)Qt的事件机制呢?

作为Qt中的任何Widget子类,具有可以实现的事件处理程序。

当一个或两个并发进程发出一个QEvent时,可以在其中一个进程的QLabel上解释它们,比如event(QEvent e)

另请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70643620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档