2013-07-24 27 views
0

我正在python 2.7中使用tkinter作爲可視化工具運行生物模擬器。地圖由方塊組成,其中顏色代表土地類型,紅色方塊代表生物。我使用canvas.move將棋盤上的紅色方塊移動。它必須移動很多。但我確切知道它應該從哪裏開始以及應該在哪裏結束。問題在於,大多數情況下,它並沒有移動,而只是消失。在下面的代碼中,我稱之爲在Simulation的init中移動,並且它可以工作。當我在sim.simulate中隨時調用它時,生物就會消失。誰能解釋爲什麼?tkinter的canvas.move使對象消失

class Map(): 
     def __init__(self,): 
      self.root = Tk() 
      self.canvas = Canvas(self.root, width=1200, height=1200) 
      self.canvas.pack() 
      self.colors = { 
       "Land": "grey", 
       "Food": "green", 
       "Water": "blue", 
       "Shelter": "black" 
      } 
      self.canvasDict = {} # the keys are (x,y, "type"), the data is the id so it can be grabbed for item config. 
      for i, row in enumerate(land.landMass): 
       for j, tile in enumerate(row): 
        color = self.colors[tile.__class__.__name__] 
        self.canvasDict[i, j, "tile"] = self.canvas.create_rectangle(50 * i, 50 * j, 50 * (i + 1), 50 * (j + 1), 
                       outline=color, fill=color) 
        info = tile.elevation 
        if color == "green": 
         info = tile.vegitation 
        elif color == "black": 
         info = tile.quality 

        self.canvasDict[i, j, "text"] = self.canvas.create_text(50 * i + 3, 50 * j, anchor=NW, fill="white", text=info) 
      self.canvasDict["creature"] = self.canvas.create_rectangle(0, 0, 50, 50, 
                     outline="red", fill="red") 
      self.canvas.pack(fill=BOTH, expand=1) 
      sim = Simulation([], 1, 2, self.root, self.canvas, self.canvasDict) 
      self.root.after(1000, sim.simulate) 

... 等功能 ...

def simulate(self): 
     self.canvas.move(self.canvasDict["creature"], 1, 1) 

     if self.generations > 0: 
      self.root.after(10000, self.canvas.move, self.canvasDict["creature"], 2 * 50, 2 * 50) 
      ... 

回答

0

我終於意識到發生了什麼。我犯了一個錯誤,認爲.move會將對象移動到畫布上的該位置,而不是將它移動到那個位置。所以當我的廣場「消失」時,它實際上只是移動可見的畫布。我認爲.after會阻止這些動作,以便我可以看到發生,但顯然不是。