我的Tkinter动画(只是一个方形移动)没有一个有序的运动。它只是做一个“随机游走”,这不是我的意图。我试图首先设置一个随机方向,但是我希望这个方块能够跟随那个随机方向,直到它撞到“墙”。但就像我说的那样,它只会随机移动。
def animate():
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
if(check_crash() == 1):
print("crash on X axis: ", canvas.coords(square))
dx = dx * (-1)
elif(check_crash() == 2):
print("crash on Y axis: ", canvas.coords(square))
dy = dy * (-1)
canvas.move(square, dx, dy)
root.after(50, animate)
我知道每次调用animate()时我都会生成新的随机值,这就是为什么我的动画不能正常工作的原因。但是,如果我从动画()中取出dx / dy,那么我必须做类似动画(dx,dy)之类的东西,而且我已经尝试了并且出现了错误。
有什么建议?谢谢!
在动画外创建dx
,dy
并在动画中使用global
来改变使用这个外部变量而不是本地变量。当您使用after()
再次运行动画时,它将保持位置
def animate():
global dx
global dy
if(check_crash() == 1):
print("crash on X axis: ", canvas.coords(square))
dx = dx * (-1)
elif(check_crash() == 2):
print("crash on Y axis: ", canvas.coords(square))
dy = dy * (-1)
canvas.move(square, dx, dy)
root.after(50, animate)
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
animate()
您可以将值作为函数的参数发送,而不是global
,但您必须在after()
中执行相同操作
def animate(dx, dy):
if(check_crash() == 1):
print("crash on X axis: ", canvas.coords(square))
dx = dx * (-1)
elif(check_crash() == 2):
print("crash on Y axis: ", canvas.coords(square))
dy = dy * (-1)
canvas.move(square, dx, dy)
root.after(50, animate, (dx, dy))
dx = random.randint(-5, 5)
dy = random.randint(-5, 5)
animate(dx, dy)
我不确定after()
是否需要它作为元组或after(50, animate, dx, dy)
例如,您可以使用while循环使方块在同一方向上不断“行走”,每50秒一次。
您可以通过定义随机方向然后启动循环来完成此操作。
循环运行时变量'flag'= True
循环使方形“行走”在随机生成的方向上。
每次广场“行走”时都不会重新生成方向。这是因为在循环运行之前生成随机生成的方向,因此当循环循环时,方向不会再次随机生成。
我已经对您的代码进行了更改(如下所示),以便它不再使用递归而是迭代,以便随机生成方向的代码只运行一次。
如果希望循环结束,则需要向while循环添加一个条件,将'flag'设置为False。目前,循环将永远持续下去。
注意:我将您删除的代码放入评论中,例如: #root.after(50,animate)
def animate():
leftorright = random.randint(1,2) #1 = LEFT, 2 = RIGHT
if leftorright = 1: #(LEFTWARDS)
dx = random.randint(-5, -1) #A random leftwards movement of 1-5 pixels
elif leftorright = 2: #(RIGHTWARDS)
dx = random.randint(1, 5) #A random rightwards movement of 1-5 pixels
upordown = random.randint(1,2) #1 = UP, 2 = DOWN
if upordown = 1: #(UPWARDS)
dy = random.randint(-5, -1) #A random upwards movement of 1-5 pixels
elif leftorright = 2: #(DOWNWARDS)
dy = random.randint(1, 5) #A random downwards movement of 1-5 pixels
flag = True
while flag = True:
if(check_crash() == 1):
print("crash on X axis: ", canvas.coords(square))
dx = dx * (-1)
elif(check_crash() == 2):
print("crash on Y axis: ", canvas.coords(square))
dy = dy * (-1)
canvas.move(square, dx, dy)
time.sleep(50)
#root.after(50, animate)