木之夏  
海纳百川,有容乃大;壁立千仞,无欲则刚

图形界面,大多会采用多线程来更新一些耗时的程序。以达到软件的流畅性使用。

多线程的实现主要有以下几种方法:

【timer】

1、通过timer.timeout() 方法来实现

在timeout后调用对应的触发函数:

下面我们简单编写一个小例子:(timeout)

ui建立两个按钮

代码实例:

# 引用库所需要的文件
from PySide2.QtCore import QTimer
timer = QTimer()

#定义信号的触发函数
  XXX.pushButtonTimestart.clicked.connect(timestart)
  XXX.pushButtonTimestop.clicked.connect(timestop)
  XXXr.timeout.connect(timeout)

# 定义槽函数
def timestart():
    timer.start(1)


def timestop():
    timer.stop()


def timeout():
    print('time out')

timer的另外一个实例:调用静态方法

QTimer.singleShot()

需要知道该方法无需信号与槽的机制,直运行一次

代码实例:

from PySide2.QtCore import QTimer
timerSingleShot = QTimer

定时500ms
timerSingleShot.singleShot(500,singleShotFun)


# 时间到达后的触发函数
def singleShotFun():
    print("this timer has stopped")

 

【QThread】线程

主要的思路是我们先建立一个进程的类,然后在其中写入我们想要实现的方法函数,当需要切入进程时就可以调用。

# 引用库

from PySide2.QtWidgets import  QMessageBox
from PySide2.QtCore import QTimer, QThread, Signal

# 定义变量 计数
global sec
sec = 0

# 定义工作线程类
class WorkThread(QThread):

    timer = Signal()  # 每隔一秒发送一段计数
    end = Signal()  # 计数完成后发送此信号
    
    #     可以在此处初始化
  def __init__(self):
  super(WorkThread,self).__init__()
   print('WorkThread 初始化完成!')
# 进程的内容用 run() 固定使用
    def run(self):
        while True:
            self.sleep(1)
            if sec == 5:
                self.end.emit()  # 发送end 信号
                break
            self.timer.emit()  # 发送 timer信号


# 生成一个新的类
workthread = WorkThread()

# 定义信号函数与槽
workthread.timer.connect(countTimer)
workthread.end.connect(endMessage)
uis.pushButton.clicked.connect(work)    

# 定义槽函数
def countTimer():
    global sec
    sec += 1
    print('触发'+ str(sec) + '')


def endMessage():
    QMessageBox.critical(
        QMainWindow(),
        '警告', '计数已经到达!')


def work():
# 开始进程用start() 固定用法
    workthread.start()

 

【子线程模板】

模板1:(Python中自带的线程)

# 线程切换模板函数
from threading import Thread

# 参数
arg1 = 1
arg2 = 2


# 定义线程入口函数
def threadFunction(Parg1, Parg2):
    print(Parg1 + Parg2)


# 调用线程   入口函数 + 传入参数
thread = Thread(target=threadFunction,
                args=(arg1, arg2)
                )
thread.start()

 

模板2:(使用QT中的线程)

# 线程切换模板函数
from threading import Thread
from PySide2.QtCore import QThread, Signal

# 参数
arg1 = 1
arg2 = 2


# 定义线程入口函数
def threadFunction(Parg1, Parg2):
    print(Parg1 + Parg2)


# 调用线程   入口函数 + 传入参数
class thread(QThread):
    global arg1, arg2
    
    def run(Parg1, Parg2):
        threadFunction(Parg1, Parg2)

thread.run(arg1, arg2)
#

模板3:

# 模板3 使用QT中的线程

from PySide2.QtCore import QThread, Signal

breakFlag = True


class WorkThread(QThread):
    signal1 = Signal()  # 信号1 的定义
    signal2 = Signal()  # 信号2 的定义

    #     可以在此处初始化
    def __init__(self):
        super(WorkThread, self).__init__()
        print('WorkThread 初始化完成!')

    # 线程的入口函数
    def run(self):
        global breakFlag
        while True:
            self.sleep(1)  # 扫描的时间 单位:秒
            if breakFlag == True:
                self.signal1.emit()  # 发送end 信号
                break
            else:
                self.signal2.emit()  # 发送 timer信号


workthread = WorkThread()
# 信号触发函数
workthread.signal1.connect(fun1)
workthread.signal2.connect(fun2)
# 进程启动信号函数
pushButton.clicked.connect(work)


# 信号1 触发槽函数
def fun1():
    pass


# 信号2 触发槽函数
def fun2():
    pass


# 进程启动函数
def work():
    workthread.start()  # 注意:进程启动默认使用 start()

 

posted on 2020-09-24 22:16  木之夏  阅读(3092)  评论(1编辑  收藏  举报