如何实时设置画布的动画



我想根据列表L中的每个数字更改十边形的每个区域(段(的填充颜色。

目前,它只在末尾显示画布,并使用列表L中的最后一个数字。

这个想法是,每次它从列表L中读取一个数字时,它都会更新画布,填充该区域,并将最后填充的区域改回白色

区域('zn'(为0-5,0为内部十边形,1-5为外部。以及格式化为1_2、2_3、3_4、4_5和5_1 的区域组合

from tkinter import *
import time
root = Tk()
cWidth = 800
cHeight = 650
canvas = Canvas(root, width=cWidth, height=cHeight)
canvas.pack()
zn1 = canvas.create_polygon(257, 635, 319, 445, 269, 409, 107, 526,outline='blue',fill='white',tag='z1',)
zn12 = canvas.create_polygon(107, 526, 269, 409, 250, 350, 50, 350,outline='black',fill='white', tag='z1_2')
zn2 = canvas.create_polygon(50, 350, 250, 350, 269, 291, 107, 174,outline='purple',fill='white', tag='z2')
zn23 = canvas.create_polygon(107, 174, 269, 291, 319, 255, 257, 65,outline='black',fill='white', tag='z2_3')
zn3 = canvas.create_polygon(257, 65, 443, 65, 381, 255, 319, 255,outline='orange',fill='white', tag='z3')
zn34 = canvas.create_polygon(443, 65, 381, 255, 431, 291, 593, 174,outline='black',fill='white', tag='z3_4')
zn4 = canvas.create_polygon(593, 174, 431, 291, 450, 350, 650, 350,outline='cyan',fill='white', tag='z4')
zn45 = canvas.create_polygon(650, 350, 450, 350, 431, 409, 593, 526,outline='black',fill='white', tag='z4_5')
zn5 = canvas.create_polygon(593, 526, 431, 409, 381, 445, 443, 635,outline='green',fill='white', tag='z5')
zn51 = canvas.create_polygon(443, 635, 381, 445, 319, 445, 257, 635,outline='black',fill='white', tag='z5_1')
zn0 = canvas.create_polygon(381, 255, 319, 255, 269, 291, 250, 350, 269, 409, 319, 445, 381, 445, 431, 409, 450, 350,
431, 291,outline='black',fill='white', tag='z0')
L= ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '1_5', '1_5', '5', '5', '5', '5', '5', '5', '5', '5', '1', '1', '1', '1', '1', '1', '1_5', '5', '1',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1_2', '2', '1_2', '0_1', '0_1', '0_1', '0_1', '1', '1',
'0_1', '0', '0_1_2', '1_2', '1', '1_2', '2', '2', '2', '2', '2', '2', '2', '1', '1', '2', '2', '2', '2_3',
'2_3', '0_2_3', '0_2', '0_2', '0_2', '2', '2', '2', '2_3', '3', '2_3', '2', '2_3', '2_3_4', '3_4', '3', '3',
'3_4', '3_4', '2_3_4', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'3', '4', '3', '3', '3_4', '4', '4', '4', '4', '3_4', '4', '4', '0_3_4', '3_4', '3', '3', '3', '3', '0', '4',
'0_4', '4', '4', '5', '4', '4', '4', '4', '4_5', '4_5', '4_5', '4_5', '5', '5', '5', '5', '5', '5', '0_5',
'0_5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '1_5', '5', '5', '5', '1',
'1_5', '0_5', '0', '0', '0', '0_1_5', '0_5', '0_5', '0_1', '0_1', '0', '1', '1_2', '0_2', '0_1', '0_1', '0_1',
'2', '1_2', '1', '0_1_2', '0_1_2', '0_1_2', '1_3', '3', '0', '0_2', '2', '2', '0', '0_2', '2', '2', '0_3',
'0_3', '0_3', '0', '0', '0', '0', '0', '3_4', '0_3_4', '0_3_4', '0', '0', '4', '5', '5', '0', '4_5', '4_5',
'4_5', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '1']
def resetMap():
canvas.itemconfig(zn0, fill='white')
canvas.itemconfig(zn1, fill='white')
canvas.itemconfig(zn12, fill='white')
canvas.itemconfig(zn2, fill='white')
canvas.itemconfig(zn23, fill='white')
canvas.itemconfig(zn3, fill='white')
canvas.itemconfig(zn34, fill='white')
canvas.itemconfig(zn4, fill='white')
canvas.itemconfig(zn45, fill='white')
canvas.itemconfig(zn5, fill='white')
canvas.itemconfig(zn51, fill='white')
def update(tkn):
if len(tkn) == 1:
if '0' in tkn:
canvas.itemconfig(zn0, fill='red')
elif '1' in tkn:
canvas.itemconfig(zn1, fill='red')
elif '2' in tkn:
canvas.itemconfig(zn2, fill='red')
elif '3' in tkn:
canvas.itemconfig(zn3, fill='red')
elif '4' in tkn:
canvas.itemconfig(zn4, fill='red')
elif '5' in tkn:
canvas.itemconfig(zn5, fill='red')
else:
# run combination
if '0' in tkn:
canvas.itemconfig(zn0, fill='red')
elif '1' in tkn and '2' in tkn:
canvas.itemconfig(zn12, fill='red')
elif '2' in tkn and '3' in tkn:
canvas.itemconfig(zn23, fill='red')
elif '3' in tkn and '4' in tkn:
canvas.itemconfig(zn34, fill='red')
elif '4' in tkn and '5' in tkn:
canvas.itemconfig(zn45, fill='red')
elif '5' in tkn and '1' in tkn:
canvas.itemconfig(zn51, fill='red')
def task():
for i in L:
print(i)
resetMap()
tkn = i.split('_')
update(tkn)
time.sleep(0.1)
task()
root.mainloop()

也许您的函数使用不正确。你可以调用.after而不是使用time.sleep()。并且不要在函数中使用for循环,我修改了你的task()函数:

from tkinter import *
import time
root = Tk()
cWidth = 800
cHeight = 650
canvas = Canvas(root, width=cWidth, height=cHeight)
canvas.pack()
zn1 = canvas.create_polygon(257, 635, 319, 445, 269, 409, 107, 526,outline='blue',fill='white',tag='z1',)
zn12 = canvas.create_polygon(107, 526, 269, 409, 250, 350, 50, 350,outline='black',fill='white', tag='z1_2')
zn2 = canvas.create_polygon(50, 350, 250, 350, 269, 291, 107, 174,outline='purple',fill='white', tag='z2')
zn23 = canvas.create_polygon(107, 174, 269, 291, 319, 255, 257, 65,outline='black',fill='white', tag='z2_3')
zn3 = canvas.create_polygon(257, 65, 443, 65, 381, 255, 319, 255,outline='orange',fill='white', tag='z3')
zn34 = canvas.create_polygon(443, 65, 381, 255, 431, 291, 593, 174,outline='black',fill='white', tag='z3_4')
zn4 = canvas.create_polygon(593, 174, 431, 291, 450, 350, 650, 350,outline='cyan',fill='white', tag='z4')
zn45 = canvas.create_polygon(650, 350, 450, 350, 431, 409, 593, 526,outline='black',fill='white', tag='z4_5')
zn5 = canvas.create_polygon(593, 526, 431, 409, 381, 445, 443, 635,outline='green',fill='white', tag='z5')
zn51 = canvas.create_polygon(443, 635, 381, 445, 319, 445, 257, 635,outline='black',fill='white', tag='z5_1')
zn0 = canvas.create_polygon(381, 255, 319, 255, 269, 291, 250, 350, 269, 409, 319, 445, 381, 445, 431, 409, 450, 350,
431, 291,outline='black',fill='white', tag='z0')
L= ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '1_5', '1_5', '5', '5', '5', '5', '5', '5', '5', '5', '1', '1', '1', '1', '1', '1', '1_5', '5', '1',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1_2', '2', '1_2', '0_1', '0_1', '0_1', '0_1', '1', '1',
'0_1', '0', '0_1_2', '1_2', '1', '1_2', '2', '2', '2', '2', '2', '2', '2', '1', '1', '2', '2', '2', '2_3',
'2_3', '0_2_3', '0_2', '0_2', '0_2', '2', '2', '2', '2_3', '3', '2_3', '2', '2_3', '2_3_4', '3_4', '3', '3',
'3_4', '3_4', '2_3_4', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'3', '4', '3', '3', '3_4', '4', '4', '4', '4', '3_4', '4', '4', '0_3_4', '3_4', '3', '3', '3', '3', '0', '4',
'0_4', '4', '4', '5', '4', '4', '4', '4', '4_5', '4_5', '4_5', '4_5', '5', '5', '5', '5', '5', '5', '0_5',
'0_5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '1_5', '5', '5', '5', '1',
'1_5', '0_5', '0', '0', '0', '0_1_5', '0_5', '0_5', '0_1', '0_1', '0', '1', '1_2', '0_2', '0_1', '0_1', '0_1',
'2', '1_2', '1', '0_1_2', '0_1_2', '0_1_2', '1_3', '3', '0', '0_2', '2', '2', '0', '0_2', '2', '2', '0_3',
'0_3', '0_3', '0', '0', '0', '0', '0', '3_4', '0_3_4', '0_3_4', '0', '0', '4', '5', '5', '0', '4_5', '4_5',
'4_5', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'5', '5', '1']
def resetMap():
canvas.itemconfig(zn0, fill='white')
canvas.itemconfig(zn1, fill='white')
canvas.itemconfig(zn12, fill='white')
canvas.itemconfig(zn2, fill='white')
canvas.itemconfig(zn23, fill='white')
canvas.itemconfig(zn3, fill='white')
canvas.itemconfig(zn34, fill='white')
canvas.itemconfig(zn4, fill='white')
canvas.itemconfig(zn45, fill='white')
canvas.itemconfig(zn5, fill='white')
canvas.itemconfig(zn51, fill='white')
def update(tkn):
if len(tkn) == 1:
if '0' in tkn:
canvas.itemconfig(zn0, fill='red')
elif '1' in tkn:
canvas.itemconfig(zn1, fill='red')
elif '2' in tkn:
canvas.itemconfig(zn2, fill='red')
elif '3' in tkn:
canvas.itemconfig(zn3, fill='red')
elif '4' in tkn:
canvas.itemconfig(zn4, fill='red')
elif '5' in tkn:
canvas.itemconfig(zn5, fill='red')
else:
# run combination
if '0' in tkn:
canvas.itemconfig(zn0, fill='red')
elif '1' in tkn and '2' in tkn:
canvas.itemconfig(zn12, fill='red')
elif '2' in tkn and '3' in tkn:
canvas.itemconfig(zn23, fill='red')
elif '3' in tkn and '4' in tkn:
canvas.itemconfig(zn34, fill='red')
elif '4' in tkn and '5' in tkn:
canvas.itemconfig(zn45, fill='red')
elif '5' in tkn and '1' in tkn:
canvas.itemconfig(zn51, fill='red')
index = 0
def task(i):
if i == len(L): # check whether the index larger than the length of the list.
return
resetMap()
tkn = L[i].split('_')
update(tkn)
root.after(100,task,i+1) # call this function per 0.1 second
root.after(100,task,index) # call after function and pass a index argument
root.mainloop()

最新更新