问题描述:
当在Python中使用tkinter,pysimplegui等其它的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窗口编辑包如此解决方式,希望能对你有所帮助!
再提一嘴,如果要收藏的兄弟连收藏都点了再点个赞也不费事是吧(手动狗头)。
还有不点收藏的兄弟也可以点个赞(手动狗头),毕竟赞又不要钱。