目录
一、前言
Python GUI程序运行时,如果点击按钮运行了一个比较耗时的操作,那么界面会卡死提示未响应。原因是主进程执行耗时等待,可能是单次执行耗时过程或for循环或while死循环,本人讲解如何以多线程的方式解决GUI程序卡顿的问题。
二、GUI程序 点击按钮卡顿或未响应案例
1、thinker GUI程序按钮定义
b = tkinter.Button(root,text = '抢购 所有商品',command=do)
b.grid(row=2,column=3,sticky=tkinter.E)
2、thinker GUI程序按钮绑定事件函数
def do():
print("\n")
print(getNowTime(),"开始执行")
try:
while True:
dataList = spuerMarket.getGoodData()
print(getNowTime(), "抢购 所有商品 ……")
if len(dataList) == 0:
print(getNowTime(), "网站首页无资源数据未抢购,持续轮循抢购检查中……")
# time.sleep(1)
for data in dataList:
# print(buy.Buy(data))
# print(order.Order())
fuckBuy(data)
except Exception as e:
print("警告数据出错,执行失败,请检查网络或配置是否正确?")
print("do Error:",e)
return
print(getNowTime(), "执行完毕\n")
3、GUI程序 点击按钮卡顿或未响应案例分析
死循环仅为需求中的一小部分……
三、GUI 解决点击按钮主进程卡顿案例
1、thinker GUI程序按钮定义
# 导入自定义多线程启动类文件
import DownThread
b = tkinter.Button(root,text = '抢购 所有商品',command=lambda :DownThread.MyThread(do))
b.grid(row=2,column=3,sticky=tkinter.E)
2、thinker GUI程序按钮绑定事件函数
# 全局开关
DownKill = False
def do():
print("\n")
print(getNowTime(),"开始执行")
try:
global DownKill
DownKill = True
while DownKill:
dataList = spuerMarket.getGoodData()
print(getNowTime(), "抢购 所有商品 ……")
if len(dataList) == 0:
print(getNowTime(), "网站首页无资源数据未抢购,持续轮循抢购检查中……")
# time.sleep(1)
for data in dataList:
# print(buy.Buy(data))
# print(order.Order())
fuckBuy(data)
except Exception as e:
print("警告数据出错,执行失败,请检查网络或配置是否正确?")
print("do Error:",e)
return
print(getNowTime(), "执行完毕\n")
3、DownThread.MyThread 定义多线程类
import threading
class MyThread(threading.Thread):
def __init__(self, func, *args):
super().__init__()
self.func = func
self.args = args
self.setDaemon(True)
self.start() # 在这里开始
def run(self):
self.func(*self.args)
4、停止While True 死循环的方法
f = tkinter.Button(root,text = '停止所有抢购',command=lambda :DownThread.MyThread(KillAll))
f.grid(row=6,column=1,sticky=tkinter.E)
# 停止所有抢购
def KillAll():
global DownKill
DownKill = False
print(getNowTime(), "停止所有抢购")
5、GUI 解决点击按钮主进程卡顿案例分析
6、进程和线程的关系图
PS:从此妈妈再也不用担心我的GUI程序点击按钮执行耗时卡顿未响应的问题了,死循环控制也被拿捏的“死死”的。
如果觉得文章写不错,那就点个赞,点个收藏吧。