Python:点击按钮导致Tkinter窗口无响应的问题排查
问题原因
Tkinter是单线程运行的,窗口的所有交互、刷新都依赖mainloop这个主事件循环。你写的while 0 == 0死循环加上time.sleep(30)会彻底占住主线程,让mainloop根本没机会处理窗口的任何事件,所以窗口就会无响应——虽然后台的print能正常运行,但窗口已经被卡死了。
解决方法
别用time.sleep和死循环,改用Tkinter自带的after()方法,它能在指定时间后调用函数,而且不会阻塞主事件循环。修改后的代码如下:
from tkinter import * cookies_clicked = 0 cursors = 0 main_window = Tk() main_window.title("Cookie Clicker") main_window.geometry("900x500") def add_cookies(): global cookies_clicked, cursors cookies_clicked += cursors print(f"当前饼干数: {cookies_clicked}") # 30秒后再次调用自己,实现循环定时 main_window.after(30000, add_cookies) def click(): global cursors cursors += 1 # 第一次触发定时逻辑 add_cookies() up_1 = Button(main_window, text="Upgrade 1", command=click) up_1.place(x=410, y=100) main_window.mainloop()
关键说明
after(30000, add_cookies)表示30000毫秒(即30秒)后执行add_cookies函数- 在
add_cookies里再次调用after,就能实现每30秒自动加饼干的循环效果 - 这种方式不会抢占主线程,窗口能正常响应操作和刷新
内容的提问来源于stack exchange,提问作者Bluffyyy
相关产品推荐
相关产品推荐

