Python GUI程序卡顿或未响应 exe程序点击按钮卡死 tkinter界面卡死的解决办法 pyinstaller -F 打包exe程序 点击按钮程序卡死 后台线程启动解决方法 实战案例

目录

一、前言

二、GUI程序 点击按钮卡顿或未响应案例

1、thinker GUI程序按钮定义

2、thinker GUI程序按钮绑定事件函数

3、GUI程序 点击按钮卡顿或未响应案例分析

三、GUI 解决点击按钮主进程卡顿案例

1、thinker GUI程序按钮定义

2、thinker GUI程序按钮绑定事件函数

3、DownThread.MyThread 定义多线程类

4、停止While True 死循环的方法

5、GUI 解决点击按钮主进程卡顿案例分析

6、进程和线程的关系图


一、前言

Python GUI程序运行时,如果点击按钮运行了一个比较耗时的操作,那么界面会卡死提示未响应。原因是主进程执行耗时等待,可能是单次执行耗时过程或for循环或while死循环,本人讲解如何以多线程的方式解决GUI程序卡顿的问题。

Python GUI程序卡顿或未响应 exe程序点击按钮卡死 tkinter界面卡死的解决办法 pyinstaller -F 打包exe程序 点击按钮程序卡死 后台线程启动解决方法 实战案例_第1张图片


二、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程序 点击按钮卡顿或未响应案例分析

1、程序点击抢购所有商品,开始执行do函数

2、do函数中while True死循环是导致程序长时间执行不结束导致未响应的主要原因

3、spuerMarket.getGoodData()函数调用存在耗时

4、for data in dataList中的for循环耗时取决于dataList的长度限制

5、综上消耗时间包括步骤2、3、4,若排除2则耗时取决于3、4执行完毕后程序恢复正常

Python GUI程序卡顿或未响应 exe程序点击按钮卡死 tkinter界面卡死的解决办法 pyinstaller -F 打包exe程序 点击按钮程序卡死 后台线程启动解决方法 实战案例_第2张图片

 死循环仅为需求中的一小部分……


三、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 解决点击按钮主进程卡顿案例分析

1、定义多线程启动类

2、thinker按钮绑定函数事件,继承 threading.Thread 类通过多线程的方式去启动后台执行

3、While True死循环,需求需要后台持续运行通过线程的方式则不再导致主进程卡顿

4、定义全局变量用于控制 While True 的参数变量 DownKill

5、新增停止所有按钮,并更改 DownKill 变量值实现停止死循环功能

6、进程和线程的关系图

Python GUI程序卡顿或未响应 exe程序点击按钮卡死 tkinter界面卡死的解决办法 pyinstaller -F 打包exe程序 点击按钮程序卡死 后台线程启动解决方法 实战案例_第3张图片

PS:从此妈妈再也不用担心我的GUI程序点击按钮执行耗时卡顿未响应的问题了,死循环控制也被拿捏的“死死”的。

 

Python GUI程序卡顿或未响应 exe程序点击按钮卡死 tkinter界面卡死的解决办法 pyinstaller -F 打包exe程序 点击按钮程序卡死 后台线程启动解决方法 实战案例_第4张图片

 测试联想:Android应用ANR程序无响应或卡死的原因可能是?    答:……

 


如果觉得文章写不错,那就点个赞,点个收藏吧。

可关注微信公众号,后期有推文


 

你可能感兴趣的:(python,python,thinker,pyinstaller,GUI程序,程序卡死)