Как обновлять текст 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())
