You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter进度条执行其他操作时冻结问题求助

解决Tkinter进度条窗口冻结未响应的问题

你的问题核心是阻塞了Tkinter的主事件循环:代码里的while循环搭配time.sleep(1)会霸占主线程,导致Tkinter无法处理窗口拖动、UI刷新这类必要事件,所以窗口显示“未响应”,但后台逻辑仍在运行。

Tkinter的正确做法是用自带的after()方法实现定时任务,它不会阻塞主循环,能让UI保持响应。下面是修改后的可运行代码:

from tkinter import *
from tkinter.ttk import *
from datetime import *

def update_progress():
    global download, GB, speed, bar, percent, text, fleft, window
    if download < GB:
        download += speed
        # 更新进度条和状态文本
        bar['value'] += (speed/GB)*100
        percent.set(str(int((download/GB)*100))+"%")
        text.set(str(download)+" files completed!")
        fleft.set(str(int(GB - download)) + " left to complete.")
        # 1秒后再次调用自身,实现循环更新
        window.after(1000, update_progress)

def main():
    start_time = datetime.now().replace(microsecond=0)
    print(start_time, "\n")

    global download, GB, speed
    GB = 100
    download = 0
    speed = 5

    window = Tk()
    percent = StringVar()
    text = StringVar()
    fleft = StringVar()

    Label(window, textvariable=percent).pack()
    Label(window, textvariable=text).pack()
    Label(window, textvariable=fleft).pack()

    bar = Progressbar(window, orient=HORIZONTAL, length=300)
    bar.pack(pady=10)

    # 启动进度更新流程
    update_progress()
    window.mainloop()

if __name__ == '__main__':
    main()

关键改动说明:

  • 移除了阻塞主线程的while循环和time.sleep(1),改用window.after(1000, update_progress)每隔1秒触发一次进度更新
  • 将进度更新逻辑封装到update_progress函数中,每次更新后若未完成目标,就再次调用after实现循环
  • 主事件循环window.mainloop()可以正常处理所有UI交互,窗口不会再出现冻结情况

内容的提问来源于stack exchange,提问作者Lee Donovan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 15:53:16