Как обновлять текст label в pyqt5

У меня есть функция вне класса, которая вызывает функцию класса UiMainWindow обновления текста label и выдается ошибка.
Мне нужно, чтобы я мог менять текст label вне класса.

Я не могу понять, как обновлять текст label в pyqt вне класса, после запуска приложения я не могу с ним взаимодействовать.

import time
from multiprocessing import Process
from datetime import datetime
import sys
import os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QMainWindow, QApplication, QLabel, QWidget
from PyQt5.QtGui import QPixmap, QPalette
from PyQt5.QtCore import Qt, QObject, QThread


def LiveCheck(ui, status):
    i = 0
    while True:
        print(i)
        ui.statusUpgrader(status + str(i))
        i += 1
        time.sleep(1)


class UiMainWindow(object):
    def __init__(self, streamers_links):
        self.streamers_links = streamers_links

    def statusUpgrader(self, status):
        _translate = QtCore.QCoreApplication.translate
        self.label.setText(_translate("MainWindow", status))
        self.label.repaint()

    def exit(self):
        raise SystemExit(1)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(362, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 336, 192))
        self.listWidget.setObjectName("listWidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 270, 331, 200))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 470, 141, 31))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.exit)
        for links in range(len(self.streamers_links)):
            item = QtWidgets.QListWidgetItem()
            self.listWidget.addItem(item)
            __sortingEnabled = self.listWidget.isSortingEnabled()
            _translate = QtCore.QCoreApplication.translate
            item = self.listWidget.item(links)
            item.setText(_translate("MainWindow", self.streamers_links[links]))
            self.listWidget.setSortingEnabled(__sortingEnabled)
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Twitch"))
        self.pushButton.setText(_translate("MainWindow", "Закрыть"))

def uinter(ui, streamers_links):
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui.setupUi(MainWindow)
    ui.statusUpgrader('afa')
    MainWindow.show()
    sys.exit(app.exec_())

def starter(ui, status):
    LiveCheck(ui, status)


if __name__ == '__main__':
    streamers_links = ['https://www.twitch.tv/rainbow6',
                        'https://www.twitch.tv/r6esportsbr2',
                        'https://www.twitch.tv/rainbow6fr',
                        'https://www.twitch.tv/rainbow6de',
                       'https://www.twitch.tv/rainbow6es',
                        'https://www.twitch.tv/rainbow6jp',
                        'https://www.twitch.tv/rainbow6tw',
                        'https://www.twitch.tv/rainbow6cntwitch',
                        'https://www.twitch.tv/rainbow6th',
                        'https://www.twitch.tv/r6esportsna',
                        'https://www.twitch.tv/rainbow6latam',
                        'https://www.twitch.tv/rainbow6kr']
    status = 'dadada'
    ui = UiMainWindow(streamers_links)
    p = Process(target=starter, args=(ui, status))
    pa = Process(target=uinter, args=(ui, streamers_links))
    pa.start()
    p.start()
    pa.join()
    p.join()

Ответы (1 шт):

Автор решения: S. Nick

Нельзя взаимодействовать в дополнительном потоке с виджетами. В Qt вы должны использовать сигналы и слоты.

Вам надо изучить раздел Signals & Slots


НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА !!!.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.


import sys
#import os
#import time
#from multiprocessing import Process
#from datetime import datetime

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QMainWindow, QApplication, \
    QLabel, QWidget
from PyQt5.QtGui import QPixmap, QPalette
from PyQt5.QtCore import Qt, QObject, QThread


class UiMainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(362, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 10, 336, 192))
        self.listWidget.setObjectName("listWidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 270, 331, 200))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 470, 141, 31))
        self.pushButton.setObjectName("pushButton")

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Twitch"))
        self.pushButton.setText(_translate("MainWindow", "Закрыть"))


class Thread(QtCore.QThread):
    updateSignal = QtCore.pyqtSignal(str)

    def __init__(self, status, parent=None):
        super(Thread, self).__init__(parent)
        self.status = status
        self.i = 0

    def run(self):
        while True:
#            print(self.i)
            self.updateSignal.emit(f'{self.status}{self.i}')
            self.i += 1
            self.msleep(1000)
        

class MainWindow(QMainWindow, UiMainWindow):
    def __init__(self, streamers_links, status):
        super().__init__()
        self.setupUi(self)
        
        self.streamers_links = streamers_links
        self.status = status

        self.pushButton.clicked.connect(self.exit)
        
        self.btnThread = QtWidgets.QPushButton("btnThread", self.centralwidget)
        self.btnThread.setGeometry(QtCore.QRect(170, 470, 141, 31))
        self.btnThread.setObjectName("btnThread")
        self.btnThread.clicked.connect(self.start_thread)
        
        for links in range(len(self.streamers_links)):
            item = QtWidgets.QListWidgetItem()
            self.listWidget.addItem(item)
            __sortingEnabled = self.listWidget.isSortingEnabled()
            _translate = QtCore.QCoreApplication.translate
            item = self.listWidget.item(links)
            item.setText(_translate("MainWindow", self.streamers_links[links]))
            self.listWidget.setSortingEnabled(__sortingEnabled)
            
        self.statusUpgrader(status)

    def statusUpgrader(self, status):
        self.label.setText(status)

    def exit(self):
        raise SystemExit(1)

    def start_thread(self):
        self.btnThread.setEnabled(False)
        
        self.thread = Thread(self.status)
        self.thread.updateSignal.connect(self.statusUpgrader)
        self.thread.start()
    

streamers_links = [
    'https://www.twitch.tv/rainbow6',
    'https://www.twitch.tv/r6esportsbr2',
    'https://www.twitch.tv/rainbow6fr',
    'https://www.twitch.tv/rainbow6de',
    'https://www.twitch.tv/rainbow6es',
    'https://www.twitch.tv/rainbow6jp',
    'https://www.twitch.tv/rainbow6tw',
    'https://www.twitch.tv/rainbow6cntwitch',
    'https://www.twitch.tv/rainbow6th',
    'https://www.twitch.tv/r6esportsna',
    'https://www.twitch.tv/rainbow6latam',
    'https://www.twitch.tv/rainbow6kr'
]

status = 'dadada'    
        

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow(streamers_links, status)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения

→ Ссылка