由于自己做的pyqt界面经常出现假死,本人实在不堪其扰,所以想学一下多线程。
话不多说,直接进入正题。
我们都知道子线程给ui主线程传递参数可以通过pyqtsignal方式来传递,但是主线程给子线程传递参数却很少人用

#方法一:全局变量法
import cv2
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit, QMainWindow
import time
import sys

from PyQt5.uic import loadUi
global singal#这就是全局变量,在主函数中修改其值,然后在子函数中获取其值,那么相当于传递参数了
#方法二:子线程类中的定义一个成员变量,这样的方法肯定比第一个好许多,有效防止变量被其他线程篡改
class BackendThread(QThread):
    # 通过类成员对象定义信号对象
    update_date = pyqtSignal(str,int)
    path=None
    # 处理要做的业务逻辑
    def setPath(self,path):#专门定义一个方法将主线程的参数传给子线程
        self.path=path
    def run(self):
        while True:
            data = QDateTime.currentDateTime()
            currTime = data.toString("yyyy-MM-dd hh:mm:ss")
            self.update_date.emit(str(currTime),5)
            time.sleep(1)
            #print(self.path)
这是一个时钟线程类,我们需要将ui进程的path值传入此类中的path值,从而根据path的不同,执行不同的方法
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        loadUi('TimeShow.ui', self)
        self.initUI()
    def initUI(self):
        # 创建线程
        self.backend = BackendThread()
        #self.backend.setPath("")
        # 连接信号
        self.backend.update_date.connect(self.handleDisplay)
        self.backend.path="./test.jpg"#也可以将子线程中的成员变量直接赋值
        self.backend.setPath("./test.jpg")#通过成员变量的方法赋值
        # 开始线程
        self.backend.start()
    def handleDisplay(self, data,number):#参数位置和signal位置一样,信号内的变量自动给到函数,相对位置也不变
        self.label.setText(data)
        #print(number)
self.backend.path="./test.jpg"#也可以将子线程中的成员变量直接赋值
self.backend.setPath("./test.jpg")#通过成员变量的方法赋值

以上两行就是赋值的方法

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐