如何在Python中改变颜色?

0 投票
2 回答
1126 浏览
提问于 2025-04-18 09:20
from tkinter import *

def move():
    global x1, y1, dx, dy, flag, n

    x1, y1 = x1 + dx, y1 + dy

    if x1 > 360:
        n = 0
        x1, dx, dy = 360, 0, 15

    if y1 > 360:
        n = 1
        y1, dx, dy = 360, -15, 0

    if x1 < 10:
        x1, dx, dy = 10, 0, -15
        n = 2

    if y1 < 10:
        y1, dx, dy = 10, 15, 0
        n = 3

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30)

    if flag > 0:
        abl1.after(50, move)

def stop():
    global flag
    flag = 0

def start():
    global flag
    if flag == 0:
        flag = 1
        move()

###

x1, y1 = 10, 10
dx, dy = 15, 0
color = [["white"], ["red"], ["green"], ["blue"]]
n = 0

flag = 0

###

abl1 = Tk()
abl1.title("Animációs gyakorlat Tkinter-rel")

can1 = Canvas(abl1, bg = "dark grey", height = 400, width = 400)
can1.pack(side=LEFT)

oval1 = can1.create_oval(x1, y1, x1 + 30, y1 + 30, fill = color[n])

but1 = Button(abl1, text = "Quit", command = abl1.destroy).pack(side=BOTTOM)
but2 = Button(abl1, text = "Start", command = start).pack()
but3 = Button(abl1, text = "Stop", command = stop).pack()

abl1.mainloop()

当小球到达方块的边缘时,它需要改变颜色。可是我用这个颜色列表和一些条件判断(ifs)却没有任何效果,我不知道哪里出了问题。我尝试了很多不同的方法,但都没有成功。谢谢你的帮助。

2 个回答

2

在你检查 x1 > 360 的地方,move() 函数里的 n == 1 应该改成 n = 1

我猜 n 是你用来作为列表索引的变量。如果是这样的话,你需要在 move() 函数底部的 flag > 0 检查之前加上以下这一行:

can1.itemconfig(oval1, fill=color[n])

这样就能像你想要的那样改变颜色了。

这是我版本的 move() 函数的复制粘贴:

def move():
    global x1, y1, dx, dy, flag, n

    x1, y1 = x1 + dx, y1 + dy

    if x1 > 360:
        n = 1
        x1, dx, dy = 360, 0, 15

    if y1 > 360:
        n += 2
        y1, dx, dy = 360, -15, 0

    if x1 < 10:
        x1, dx, dy = 10, 0, -15
        n = 2

    if y1 < 10:
        y1, dx, dy = 10, 15, 0
        n = 3

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30)

    can1.itemconfig(oval1, fill=color[n])

    if flag > 0:
        abl1.after(50, move)

补充:Jaredp37 的答案肯定比我的更有效率,因为我的方法每次调用这个函数时都会尝试改变颜色。

1

在你的移动函数里,每次循环都需要设置 itemconfig() 的填充参数。调用 can1.create_oval() 会返回一个椭圆的 ID,你可以把这个 ID 作为第一个参数传给 itemconfig() 方法。然后你就可以在这里设置填充颜色,像下面的代码那样。不过,这样写并不是最有效率的方式。考虑到你使用了很多全局变量,最好把这个脚本改成一个类。

def move():
    global x1, y1, dx, dy, flag, n

    x1, y1 = x1 + dx, y1 + dy

    if x1 > 360:
        n = 1 
        x1, dx, dy = 360, 0, 15
        can1.itemconfig(1, fill=color[n])

    if y1 > 360:
        n = n + 2
        y1, dx, dy = 360, -15, 0
        can1.itemconfig(1, fill=color[n])

    if x1 < 10:
        n = 2
        x1, dx, dy = 10, 0, -15
        can1.itemconfig(1, fill=color[n])

    if y1 < 10:
        n = 3
        y1, dx, dy = 10, 15, 0
        can1.itemconfig(1, fill=color[n])

    can1.coords(oval1, x1, y1, x1 + 30, y1 + 30)

    if flag > 0:
        abl1.after(50, move)

撰写回答