2013-02-03 60 views
-1

这是我在stackoverflow上的第一篇文章,所以我很抱歉,如果它不完美的清晰。所以,我需要我的CompSci课程的帮助。Tkinter:随机移动一千个点

以下是说明:

在窗口中心初始化1000个点。

  • 在每个时间步重复1000次......
    • 翻转四面的硬币,然后或移动点上下或左或右 。 - 想法是为1000 点中的每一个独立完成此操作。所以,一点的移动并不影响其他点的移动。
    • 在每个点的当前位置绘制一个“点”或1 x 1矩形。
    • 附上三个屏幕截图,分别显示早期,中期和晚期发行版。

我已经粘贴下面有什么,我这么远:

这段代码的问题是:它不会显示该点的“移动”。我的导师希望它像动画一样。因为有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() 
+0

你参加什么样的学校? – lelloman

+0

我参加了一所高中。 – carte

+0

清除画布;移动点;画点;等待33ms;重复。 – JayC

回答

1

这个问题似乎是canvas不知道该动画的每个步骤该怎么做。如果您将用于更新画布的代码放到函数中(称为redraw()),请在程序的主要过程中调用该函数以绘制第一幅图像,并将类似canvas.after(tim,redraw)的调用作为最后一行redraw()函数,这将确保画布每隔tim毫秒更新一次。

(EDIT)

我还请注意,randint(-2,2)从列表[-2,-1,0,1,2]生成随机选择的,而不是从列表[-2,2],这是你看起来是被期望的。此外,如果您试图模拟四面模具,其中四面为+ 2x,-2x,+ 2y,-2y;那么分别计算x和y方向上的随机运动将不会这样做,因为它会在每个时间步的每个点的x和y方向上产生运动。

+0

谢谢! canvas.after方法起作用。你的随机运动部分的权利。你对如何改变代码有什么建议,所以它只能在每个步骤中向一个方向移动? – carte

+1

如果你看看'random'模块,你会发现一个广泛的功能选择。它们中的任何一个都可以用来模拟四面骰子。某些实现选项需要某些if语句的帮助,以便根据+ x,-x,+ y或-y运动来解释模具卷的结果。 – Simon