pyqt5主进程和子线程之间传递数据界面卡死!

错误:使用 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_()

你可能感兴趣的:(qt,python,qt5)