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它没有做任何事情,我不知道什么是错的。我尝试了很多不同的变种,但也没有用。 谢谢你的帮助。
答案 0 :(得分:2)
在x1 > 360
签入move()
内,n == 1
应为n = 1
。
我认为n
是您用作列表索引的变量。如果是这样,您需要在flag > 0
底部的move()
检查之前添加以下行:
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 :(得分:1)
在移动功能中,您必须在每次迭代时设置itemconfig()填充参数。对can1.create_oval()的调用返回椭圆的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)