图形界面,大多会采用多线程来更新一些耗时的程序。以达到软件的流畅性使用。
多线程的实现主要有以下几种方法:
【timer】
1、通过timer.timeout() 方法来实现
在timeout后调用对应的触发函数:
下面我们简单编写一个小例子:(timeout)
ui建立两个按钮
代码实例:
#引用库所需要的文件
from PySide2.QtCore importQTimer
timer=QTimer()#定义信号的触发函数
XXX.pushButtonTimestart.clicked.connect(timestart)
XXX.pushButtonTimestop.clicked.connect(timestop)
XXXr.timeout.connect(timeout)#定义槽函数
deftimestart():
timer.start(1)deftimestop():
timer.stop()deftimeout():print('time out')
timer的另外一个实例:调用静态方法
QTimer.singleShot()
需要知道该方法无需信号与槽的机制,直运行一次
代码实例:
from PySide2.QtCore importQTimer
timerSingleShot=QTimer
定时500ms
timerSingleShot.singleShot(500,singleShotFun)#时间到达后的触发函数
defsingleShotFun():print("this timer has stopped")
【QThread】线程
主要的思路是我们先建立一个进程的类,然后在其中写入我们想要实现的方法函数,当需要切入进程时就可以调用。
#引用库
from PySide2.QtWidgets importQMessageBoxfrom PySide2.QtCore importQTimer, QThread, Signal#定义变量 计数
globalsec
sec=0#定义工作线程类
classWorkThread(QThread):
timer= Signal() #每隔一秒发送一段计数
end = Signal() #计数完成后发送此信号
#可以在此处初始化
def __init__(self):
super(WorkThread,self).__init__()
print('WorkThread 初始化完成!')
#进程的内容用 run() 固定使用
defrun(self):whileTrue:
self.sleep(1)if sec == 5:
self.end.emit()#发送end 信号
breakself.timer.emit()#发送 timer信号
#生成一个新的类
workthread =WorkThread()#定义信号函数与槽
workthread.timer.connect(countTimer)
workthread.end.connect(endMessage)
uis.pushButton.clicked.connect(work)#定义槽函数
defcountTimer():globalsec
sec+= 1
print('触发'+ str(sec) + '次')defendMessage():
QMessageBox.critical(
QMainWindow(),'警告', '计数已经到达!')defwork():#开始进程用start() 固定用法
workthread.start()
【子线程模板】
模板1:(Python中自带的线程)
#线程切换模板函数
from threading importThread#参数
arg1 = 1arg2= 2
#定义线程入口函数
defthreadFunction(Parg1, Parg2):print(Parg1 +Parg2)#调用线程 入口函数 + 传入参数
thread = Thread(target=threadFunction,
args=(arg1, arg2)
)
thread.start()
模板2:(使用QT中的线程)
#线程切换模板函数
from threading importThreadfrom PySide2.QtCore importQThread, Signal#参数
arg1 = 1arg2= 2
#定义线程入口函数
defthreadFunction(Parg1, Parg2):print(Parg1 +Parg2)#调用线程 入口函数 + 传入参数
classthread(QThread):globalarg1, arg2defrun(Parg1, Parg2):
threadFunction(Parg1, Parg2)
thread.run(arg1, arg2)#
模板3:
#模板3 使用QT中的线程
from PySide2.QtCore importQThread, Signal
breakFlag=TrueclassWorkThread(QThread):
signal1= Signal() #信号1 的定义
signal2 = Signal() #信号2 的定义
#可以在此处初始化
def __init__(self):
super(WorkThread, self).__init__()print('WorkThread 初始化完成!')#线程的入口函数
defrun(self):globalbreakFlagwhileTrue:
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 触发槽函数
deffun1():pass
#信号2 触发槽函数
deffun2():pass
#进程启动函数
defwork():
workthread.start()#注意:进程启动默认使用 start()