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

Tkinter中DVD弹跳Logo图像无法切换问题求助

Tkinter DVD弹跳Logo无法切换图像问题

问题概述

程序无报错,Logo可正常弹跳,但无法切换4张不同颜色的图像。已尝试删除旧图像重建、使用canvas.itemconfig()更新图像、刷新界面等方法,均无效。

完整代码

import random
from tkinter import *
from PIL import ImageTk, Image

root = Tk()
root.title("DVD Logo")
root.resizable(False, False)
root.attributes("-fullscreen", True)

width = root.winfo_screenwidth()
height = root.winfo_screenheight()

dvd_vermelho = Image.open("dvd_vermelho.png").resize((256, 256))
dvd_verde = Image.open("dvd_verde.png").resize((256, 256))
dvd_azul = Image.open("dvd_azul.png").resize((256, 256))
dvd_amarelo = Image.open("dvd_amarelo.png").resize((256, 256))

x,y = dvd_vermelho.size
canvas_x = width
canvas_y = height

canvas = Canvas(root, width=canvas_x, height=canvas_y, bg="blue")
canvas.pack()
root.update()
canvas_widht = canvas.winfo_width()
canvas_height = canvas.winfo_height()

dvd_vermelho_tk = ImageTk.PhotoImage(dvd_vermelho, master=canvas)
dvd_verde_tk = ImageTk.PhotoImage(dvd_verde, master=canvas)
dvd_amarelo_tk = ImageTk.PhotoImage(dvd_amarelo, master=canvas)
dvd_azul_tk = ImageTk.PhotoImage(dvd_azul, master=canvas)

dvd_logos = [dvd_amarelo_tk, dvd_verde_tk, dvd_vermelho_tk, dvd_azul_tk]
containerDVD = canvas.create_image(0, 0, anchor=NW, image=dvd_logos[0])

valuex = 2
valuey = 3

random_x = random.randint(0, canvas_widht - x)
random_y = random.randint(0, canvas_height - y)

canvas.move(containerDVD, random_x, random_y)

initial_trajectory_x = random.choice([-valuex, valuex])
initial_trajectory_y = random.choice([-valuey, valuey])

current_posx = random_x
current_posy = random_y

def changeImage():
    global dvd_azul_tk, dvd_verde_tk, dvd_vermelho_tk, dvd_amarelo_tk, containerDVD
    last_exit = dvd_logos.pop(0)
    dvd_logos.append(last_exit)
    canvas.delete(containerDVD)
    containerDVD = canvas.create_image(current_posx, current_posy, anchor=NW, image=dvd_logos[0])

def moveDVD():
    global current_posx, current_posy, initial_trajectory_x, initial_trajectory_y, dvd

    canvas.move(containerDVD, initial_trajectory_x, initial_trajectory_y)
    current_posx += initial_trajectory_x
    current_posy += initial_trajectory_y

    if current_posx <= 0 or current_posx+x >= canvas_widht:
        initial_trajectory_x *= -1
        changeImage()
    if current_posy <= 0 or current_posy+y >= canvas_height:
        initial_trajectory_y *= -1
        changeImage()

    root.after(12, moveDVD)

root.after(12, moveDVD)

root.mainloop()

核心问题代码

def changeImage():
    global dvd_azul_tk, dvd_verde_tk, dvd_vermelho_tk, dvd_amarelo_tk, containerDVD
    last_exit = dvd_logos.pop(0)
    dvd_logos.append(last_exit)
    canvas.delete(containerDVD)
    containerDVD = canvas.create_image(current_posx, current_posy, anchor=NW, image=dvd_logos[0])

疑问

已尝试多种图像更新方式均无效,请问是图像引用问题还是after循环的问题?遗漏了哪些步骤?


内容的提问来源于stack exchange,提问作者Gustavo Godoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:57:53