目录

一、前言

二、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运行卡住如何跳过 python卡了怎么办_python运行卡住如何跳过


二、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运行卡住如何跳过 python卡了怎么办_python_02

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


三、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运行卡住如何跳过 python卡了怎么办_thinker_03

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

 

python运行卡住如何跳过 python卡了怎么办_pyinstaller_04

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