PyQT. Почему не работает show() в потоке?
Если showLabel() используется вне потока, то всё работает.
Если я пытаюсь поместить showLabel() в поток, то программа зависает и вылетает именно на строке self.label.show().
В чём может быть проблема и как это можно решить?
Код (очень сокращён):
import sys
from threading import *
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Window')
self.setGeometry(300, 300, 500, 500)
def showLabel(self):
self.label = QLabel('Label', self)
self.label.move(100, 100)
self.label.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
showLabel() # Без потока
Thread(target=window.showLabel).start() # С потоком
sys.exit(app.exec())
Ответы (2 шт):
Автор решения: Victor VosMottor
→ Ссылка
import sys
from threading import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import pyqtSignal
class Window(QWidget):
signal = pyqtSignal()
def __init__(self):
super().__init__()
self.initUI()
self.signal.connect(self.showLabel)
def initUI(self):
self.setWindowTitle('Window')
self.setGeometry(300, 300, 500, 500)
def showLabel(self):
self.label = QLabel('Label', self)
self.label.move(100, 100)
self.label.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
window.showLabel() # Без потока
Thread(target=window.signal.emit).start() # С потоком
sys.exit(app.exec())
Автор решения: S. Nick
→ Ссылка
Элементы графического интерфейса (все, что унаследовано или связано с подклассом QWidget) должны быть созданы и доступны только из основного потока Qt.
import sys
#from threading import *
from PyQt5.Qt import *
class Thread(QThread):
dataThread = pyqtSignal(str)
def __init__(self):
QThread.__init__(self)
self.number = 1
def run(self):
for i in range(20):
self.dataThread.emit(f"Label {self.number}")
self.number += 1
self.msleep(1000)
class Window(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Window')
self.label = QLabel(self)
self.label.move(100, 100)
self.showLabel('Label ')
self.worker = Thread()
self.worker.dataThread.connect(self.showLabel)
self.worker.start()
def showLabel(self, text):
self.label.setText(text)
self.label.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.resize(500, 500)
window.show()
sys.exit(app.exec_())
