2013-07-24 48 views
1

我正在python 2.7中運行生物模擬器,並使用tkinter作爲可視化工具。地圖由方塊組成,其中顏色代表土地類型,紅色方塊代表生物。我使用canvas.move將棋盤上的紅色方塊移開。它必須移動很多。但我確切知道它應該從哪裏開始以及應該在哪裏結束。我已經一點一點地運行了模擬,並且當它被調整爲可能的兩個動作時,即。模擬並不真正運行我只是測試它。我可以看到動作。但是當我真的運行這個模擬器時,所有的東西都會嗡嗡作響,而我所能看到的畫布就是地圖,但沒有生物,也沒有生物的移動。所以我的問題是這樣的。首先,我怎麼可能放慢這個過程,以便我可以看到這些動作?或者爲什麼模擬運行並現在顯示任何tkinter?Tkinter進程在運行時未顯示

模擬量非常大,很難挑出重要的位,所以下面的代碼更加簡化。但它匹配我做了tkinter的東西。我的SIM只是增加了更多的計算和循環。值得注意的是,這個例子完美無缺。

Driver.py:

from Tkinter import * 
import animation 


class Alien(object): 
    def __init__(self): 
     #Set up canvas 
     self.root = Tk() 
     self.canvas = Canvas(self.root, width=400, height=400) 
     self.canvas.pack() 
     #Vars 
     self.map = [[1, 0, 0, 1, 0], [0, 1, 0, 1, 0], [0, 0, 1, 0, 0], [0, 1, 1, 0, 0], [1, 0, 0, 1, 0]] 
     self.x = 0 
     self.y = 0 
     r = 50 
     self.land = {} 
     #Draw Init 
     for i, row in enumerate(self.map): 
      for j, cell in enumerate(row): 
       color = "black" if cell else "green" 
       self.canvas.create_rectangle(r * i, r * j, r * (i + 1), r * (j + 1), 
              outline=color, fill=color) 
       self.land[(i, j)] = self.canvas.create_text(r * i, r * j, anchor=NE, fill="white", text="1", tag=str((i, j))) 
     self.creature = self.canvas.create_rectangle(r * self.x, r * self.y, r * (self.x + 1), r * (self.y + 1), 
                outline="red", fill="red") 
     self.canvas.pack(fill=BOTH, expand=1) 
     #Action 
     movement = animation.Animation(self.root, self.canvas, self.creature, self.land) 
     self.root.after(0, movement.animate) 
     #Clost TK 
     self.root.mainloop() 
a = Alien() 

animation.py:

from random import randrange 
import sys 


class Animation(): 
    def __init__(self, root, canvas, creature, land): 
     self.x = self.y = 0 
     self.ctr = 10 
     self.canvas = canvas 
     self.creature = creature 
     self.root = root 
     self.land = land 
     #self.root.after(250, self.animate) 
     self.canvas.move(self.creature, 2 * 50, 2 * 50) 

    def animate(self): 
     self.ctr -= 1 
     if self.ctr > 0: 
      for i in range(2): 
       i = randrange(1, 5) 
       if i == 1: 
        self.y = -1 
       elif i == 2: 
        self.y = 1 
       elif i == 3: 
        self.x = -1 
       elif i == 4: 
        self.x = 1 
       #root.after(250, self.animate(canvas, creature)) 
       """Moves creature around canvas""" 
       self.movement() 
      self.root.after(250, self.animate) 

    def movement(self): 
     self.canvas.move(self.creature, self.x * 50, self.y * 50) 

回答

0

則可以使用tkinters after方法,其可以通過任何difrent插件被用來減緩的處理。

canvas.after(time, dosomething) #the first parameter is how many milliseconds it will wait before it will call the second parameter. 

您的dosomething函數應該是您更新您的cnavas的方式。

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.html

相關問題