图形界面,大多会采用多线程来更新一些耗时的程序。以达到软件的流畅性使用。
多线程的实现主要有以下几种方法:
【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()