错误:使用 pyqt5 画界面以后,想要用子线程的数据来更新主进程的界面,看起来没毛病,一运行,界面卡死。
原因:资源竞争。如果需要这样传递数据资源,一般是需要为这样的资源加互斥锁,避免两个线程争抢。
解决:可以采用槽函数的方式,子线程发送带有数据的信号,主进程接受信号,执行槽函数。
代码示例如下:
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget
import sys
import time
class Worker(QThread):
signal = pyqtSignal(str) # 定义一个信号,该信号在每秒钟发射一次,带有一个字符串参数
def run(self):
while True:
time.sleep(1)
self.signal.emit("Hello from thread") # 发射信号,带有一个字符串参数
class Window(QWidget):
def __init__(self):
super().__init__()
self.label = QLabel("Initial text")
layout = QVBoxLayout()
layout.addWidget(self.label)
self.setLayout(layout)
self.worker = Worker()
self.worker.signal.connect(self.update_label) # 连接信号到槽函数
self.worker.start()
def update_label(self, text):
self.label.setText(text) # 在主线程中更新标签的文本
app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()