2013-02-03 58 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