如何在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
相关产品推荐
相关产品推荐

