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

如何在Python Tkinter窗口中实现图片持续旋转加载动画

实现Tkinter旋转加载动画的正确方案

原代码的问题分析

  • 错误使用while True阻塞Tkinter事件循环,导致界面完全无响应,Tkinter的定时/循环任务必须用after()方法实现。
  • 反复读写本地图片文件完全没必要,直接在内存中旋转即可,既低效又容易引发文件操作错误。
  • PhotoImage对象未保留持久引用,会被Python垃圾回收机制清理,导致图片无法显示。
  • root.mainloop()只能调用一次,放在循环内会导致程序无法正常启动事件循环。
  • 存在拼写错误:rotated_image.save("Loding_Icon.png")中的Loding应为Loading。

正确实现代码

直接在内存中循环旋转图片,用Tkinter的after()方法实现流畅动画,同时解决图片引用回收问题:

import tkinter as tk
from PIL import ImageTk, Image

def rotate_loading(angle):
    # 以图片中心旋转,expand=True避免旋转后图片被裁剪
    rotated_img = original_img.rotate(angle, expand=True)
    # 更新PhotoImage对象,全局引用防止被回收
    global tk_img
    tk_img = ImageTk.PhotoImage(rotated_img)
    # 更新Canvas上的加载图标
    canvas.itemconfig(loading_item, image=tk_img)
    # 递归调用,每20毫秒旋转5度(可根据需求调整参数)
    root.after(20, rotate_loading, angle + 5)

if __name__ == "__main__":
    root = tk.Tk()
    root.title("加载动画")
    # 创建画布,尺寸可按需调整
    canvas = tk.Canvas(root, width=200, height=200)
    canvas.pack()

    # 加载原始加载图标(替换为你的本地图片路径)
    original_img = Image.open("Loading_Icon.png")
    # 初始化图片对象与画布元素
    tk_img = ImageTk.PhotoImage(original_img)
    loading_item = canvas.create_image(100, 100, image=tk_img)

    # 启动旋转动画,初始角度为0
    rotate_loading(0)

    root.mainloop()

代码说明

  • 保留original_img原始图片对象,每次旋转都基于它,避免累积旋转误差。
  • after(20, rotate_loading, angle +5)实现定时旋转逻辑,20毫秒是动画刷新间隔,5度是单次旋转角度,可根据需求调整数值。
  • global tk_img确保PhotoImage对象被全局引用,不会被垃圾回收。
  • rotate()方法的expand=True参数保证旋转后的图片完整显示,不会出现裁剪问题。

内容的提问来源于stack exchange,提问作者Empire of programmers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:40:27