Tkinter:随机移动一千个点
这是我在StackOverflow上的第一篇帖子,如果表达得不够清楚或完美,请见谅。我需要帮助来完成我计算机科学课的程序。
以下是作业要求:
在窗口的中心初始化1000个点。
- 在每个时间步骤中重复1000次...
- 抛一个四面骰子,然后让一个点向上、向下、向左或向右移动。 - 这个想法是对每个点的移动都是独立的,也就是说,一个点的移动不会影响到其他点的移动。
- 在每个点的当前位置画一个“点”或一个1 x 1的矩形。
- 附上三张截图,展示早期、中期和晚期的分布情况。
下面是我目前写的代码:
这个代码的问题是:它不会显示点在“移动”。我的老师希望它看起来像动画。因为有1000个点,每个点要移动1000次,所以不同“帧”之间的延迟必须非常短。
如果有人能帮我做到这一点,我将非常感激。
from Tkinter import Tk, Canvas
from random import randint
d=0
t=0
v=1000
x = []
y = []
for i in range(1000):
x.append(300)
y.append(300)
root=Tk()
canvas=Canvas(root, width=600, height=600, bg="white")#creates the canvas
for l in range(v):
for k in range(t):
for i in range(len(x)):
x[i] += randint(-2,2)
y[i] += randint(-2,2)
for i in range(1000):
canvas.create_rectangle(x[i],y[i],x[i],y[i])
if l < 999:
for i in range(1000):
canvas.create_rectangle(x[i],y[i],x[i],y[i], outline='white')
t+=1
l+=1
canvas.pack()
root.mainloop()
1 个回答
1
问题似乎出在 canvas
不知道在动画的每一步该做什么。如果你把用来更新画布的代码放在一个函数里(可以叫它 redraw()
),然后在程序的主要部分调用这个函数来绘制第一张图像,并在 redraw()
函数的最后一行加上 canvas.after(tim,redraw)
,这样就能确保画布每 tim
毫秒更新一次。
(编辑)
我还想提一下,randint(-2,2)
是从列表 [-2,-1,0,1,2]
中随机选择,而不是从 [-2,2]
中选择,这可能是你想要的结果。另外,如果你想模拟一个四面骰子,四个面分别是:+2x、-2x、+2y、-2y;那么单独计算 x 和 y 方向的随机移动是行不通的,因为这样会在每个时间点同时在 x 和 y 方向上产生移动。