python开发gui线程_Python 开发GUI之 多线程的实现

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

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

【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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值