Python 关于GUI界面因长耗时任务致使未响应的解决办法

问题描述:

当在Python中使用tkinterpysimplegui等其它的GUI页

面编辑工具去创建窗口后,一旦给按钮绑定一个长且耗时的函数,点击按钮后就总会出现未响应的字样,如下所示:

import tkinter as tk
import time

def button_click():

    time.sleep(30)  # 这里代表一个需要30s运行时间的程序

    print("按钮被点击")

root = tk.Tk()

button = tk.Button(root, text="点击我", command=button_click, width=10, height=5)
button.pack()
root.geometry('700x500+450+200')
root.mainloop()

 问题原因:

之所以会出现此种情况,是因为在Python中GUI窗口被创建后就会不断循环以此来接受如鼠标点击这样的事件,从而占用了主线程,这时一旦我们想要添加一些耗时任务就会占用主线程的资源,那么窗口就不能保持不断循环,从而显示未响应字样。

通俗理解,就相当于一个每1s循环一次的while Ture无限循环,假设这个while Ture循环是一个红绿灯,它的作用是每一秒让一辆车通过路口,而每一辆车刚好1s就能通过路口,正常情况下每一辆车依次过路口不会出车祸,然而你却给这个红绿灯搞了一辆慢吞吞的婴儿车,当婴儿车还没过路口的时候后面的车就追尾了……

意思大概就是这个意思,能理解就理解,不能理解就直接往下看解决办法。

解决方法:

解决方法很简单,既然占用了主线程的资源,那我们不让它占用就行了,再开一条线程就能解决问题。

通过利用Python中的threading库,给长且耗时的任务单开一个线程就能解决此问题。例子如下:

 

import time
import threading


def start_main_thread():

    threading.Thread(target=button_click).start()

def button_click():

    start_time = time.time()  # 记录开始时间

    time.sleep(30)  # 这里代表一个需要30s运行时间的程序

    end_time = time.time()  # 记录结束时间

    execution_time = end_time - start_time  # 运行时间

    print("函数运行时间:", execution_time, "秒")

root = tk.Tk()

button = tk.Button(root, text="点击我", command=start_main_thread, width=10, height=5)
button.pack()
root.geometry('700x500+450+200')
root.mainloop()

总结:

这里我使用的是tkinter写的GUI页面,除此之外sg或者qt其它 的GUI窗口编辑包如此解决方式,希望能对你有所帮助!

再提一嘴,如果要收藏的兄弟连收藏都点了再点个赞也不费事是吧(手动狗头)。

还有不点收藏的兄弟也可以点个赞(手动狗头),毕竟赞又不要钱。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值