Tkinter:随机移动一千个点

-1 投票
1 回答
1680 浏览
提问于 2025-04-17 14:35

这是我在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 方向上产生移动。

撰写回答