赞
踩
前面的文章已经介绍过两种小技巧,让我们回顾一下,就是:
1、在window.mainloop()前一定要加window.after(250) #250ms 用于延迟进行窗体本身的死循环,250毫秒时间可以根据实际情况调整,对于I/O执行时间较长的,可以加到1000毫秒
2、在我们按下button,绑定的command要执行的函数体内部,加window.update_idletasks()进行窗体刷新
3、如果以上方法效果都不明显,那么就是我们今天重点要讨论的多线程出场了。讲多线程解决界面卡死的文章不下少数,可是很少有一篇能真正讲明白的,本文试着谈谈自己在实践中的心得体会。
多线程听起来挺高大上的,幸好python把它做成了模块,而且还原生自带,让多线程用起来就跟函数调用一样方便。python中有Threading和Thread模块,Threading用于增强多线程模块 thread的,所以多线程不用想用Threading。import threading吧。
另外我们写的程序任务,可以分为CPU密集型和I/O密集型,CPU密集型是指需要大量消耗CPU资源进行密集计算的任务,比如浮点数计算,科学数据计算等,由于python有全局锁 (GIL)的存在,python多线程并不适合跑这种任务,因为全局锁会限制所有的多线程其实是跑在一个主线程之下的,而多线程的线程切换是需要消耗CPU资源的,所以多线程跑CPU密集型不敢说是灾难,至少也快不起来。
下面谈谈多线程在I/O密集型任务中的表现吧,先解释下I/O密集型是啥情况,比如我们读写文件,从网上下载资源等都是I/O操作,I/O操作占用CPU资源往往不多,但是却挺费时间的,比如下载10个文件,你要是单线程一个一个下,一个在下,其他都得干等着,那时间就挺长的,碰到中间某一个下载比较慢,那就是浪费很多时间;多线程就是可以解决这个问题。一次3-4个文件同时下,一个没速度,闲置的带宽会被其他三个所瓜分,保证网络不会闲置,文件下载不会停止。
言归正传,我们可以用以下代码启动一个线程:
my_thread = threading.Thread(target=function, args=(i,))
my_thread.start()
如果要启动多个线程,我们就在前面加个循环,比如 for i in range(5):
。其中function是函数名,args是函数的参数项,i是要传入function的值,相当于形参。注意即使只有i一个参数,格式也要这么写args=(i,)。
很显然,我们在tkinter开发界面的时候,UI界面就相当于一个主线程,它所绑定的command后面的函数就是我们要打包扔进线程的函数function。注意function内部要是还有函数调用,也得把function扔进线程,不然单单把内部函数扔进线程,还是要卡的哦,这一点在实践中是深有体会的,大家别踩这个坑。另外,我们在启动线程之后,不要在my_thread.start()后面加my_thread.join(),加了就会阻塞线程,界面又变卡了。是不是坑很多啊,今天就讲这么多了,觉得好,欢迎转发收藏。
=======================
以一个小程序为例,讲解lambda函数在tkinter中的应用
from tkinter import *
from tkinter import messagebox
def mouseTest(a,b):
messagebox.showinfo("结果","传递的参数是a={},b={}".format(a,b))
root = Tk()
Button(root, text="测试", command= lambda :mouseTest("s","z")).pack()
root.mainloop()
1
2
3
4
5
6
7
8
9
创建了一个名为“测试”的按钮,按下按钮后执行mouseTest函数,并且函数需要传递参数。所以令command= lambda :mouseTest(“s”,“z”),这里向mouseTest函数传递的参数为"s",“z”。运行结果如下图所示:
点击测试按钮,弹出窗口,如下图所示:
如果不用lambda函数,而是直接令command= mouseTest(“s”,“z”),程序运行结果如下所示:
可以发现,mouseTest函数自动执行,所以在给函数传递参数时需要使用lambda函数。
————————————————
版权声明:本文为CSDN博主「Hello3q3q」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45727931/article/details/107957074
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。