Смена цвета tkinter при движении фигуры
1) Нужно сделать так, чтобы при движении круга вправо, он менял свой цвет на протяжении всего движения на цвета, которые записаны в списке. Но устанавливается только один цвет, смены не происходит. В чём проблема?
colorlist = ["red","black","white","green"]
random_color = random.choice(colorlist)
def moving():
canvas.move(shell, 1,0)
canvas.itemconfigure(shell, fill=f"{random_color}")
canvas.after(10,moving)
moving()
window.mainloop()
2) Сделал второй вид программы, но здесь цвет меняется только один раз и больше шарик не движется и не меняет цвет. Как можно сделать так, чтобы это всё происходило, допустим, пока он не дойдёт до конца окна?
colorlist = ["red","black","white","green"]
random_color = random.choice(colorlist)
def moving():
canvas.coords(shell, canvas.coords(shell)[0]+10,15,canvas.coords(shell)[2]+10,105)
canvas.itemconfig(shell, fill=f"{random_color}")
canvas.after(1000,moving)
window.mainloop()
Ответы (2 шт):
У вас random_color - глобальная переменная, и при вызове функции moving она не изменяется. Надо изменять её в каждом вызове, например так:
colorlist = ["red", "black", "white", "green"]
random_color = random.choice(colorlist)
def moving():
canvas.move(shell, 1, 0)
canvas.itemconfigure(shell, fill=random_color)
random_color = random.choice(colorlist)
canvas.after(10, moving)
moving()
window.mainloop()
А лучше сделать её вообще локальной, например так:
colorlist = ["red", "black", "white", "green"]
def moving():
canvas.move(shell, 1, 0)
random_color = random.choice(colorlist)
canvas.itemconfigure(shell, fill=random_color)
canvas.after(10, moving)
moving()
window.mainloop()
Идею одновременного и движения, и изменения при этом цветов шариков можно реализовать с помощью потоков — threading
import tkinter, threading
...
shell1 = canvas.create_oval((15, 15), (105, 105), fill='#FFDE59',outline="#494949", width=8)
def moving1():
if canvas.coords(shell1)[0] < 690:
canvas.move(shell1, 1,0)
canvas.after(10,moving1)
if canvas.coords(shell1)[0] == 690:
canvas.move(shell1,0,1)
canvas.after(20,moving1)
def change_color():
while True:
time.sleep(0.5)
colorlist = ["#f00","#ff0","#3f0","#00f","#f0f","#fff","#000000","#0000FF"]
random_color = random.choice(colorlist)
canvas.itemconfig(shell1, fill=f"{random_color}")
m1 = threading.Thread(target=moving1)
c1 = threading.Thread(target=change_color)
m1.start()
c1.start()
window.mainloop()