我有一个模拟,创建在地图周围移动。地图用tkinter绘制。在模拟的初始化中,我调用
root = Tk()
root.geometry("800x800+300+300")
self.ex = land.Example(root)
root.mainloop()
启动tkinter,其中land.Example是下面的类。应该发生的事情是最初绘制地图,然后模拟运行,任何时候生物移动它将使用self.ex在tkinter中绘制。问题是,当它运行时,最初绘制地图,我必须关闭它,以便运行其余的模拟。在这种情况下,整个事情都会中断,因为模拟试图使用不再存在的画布。我该如何解决这个问题,以便地图和模拟都能继续运行
模拟self.ex互动
def move(self, creature, target):
self.map[creature.x][creature.y].creatures.remove(creature)
self.ex.updateMap(creature.x, creature.y, "remove")
land.Example
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.parent.title("Board")
self.pack(fill=BOTH, expand=1)
self.canvas = Canvas(self)
self.upperX = 0
self.lowerX = 0
self.upperY = 0
self.lowerY = 0
for x, row in enumerate(landMass):
for y, cell in enumerate(row):
color = "grey"
if isinstance(landMass[x][y], Food):
color = "green"
elif isinstance(landMass[x][y], Water):
color = "blue"
elif isinstance(landMass[x][y], Shelter):
color = "black"
self.canvas.create_rectangle(50 * x , 50 * y , 50 * x + 50, 50 * y + 50,
outline=color, fill=color)
self.canvas.create_text(3 + 50 * x, 3 + 50 * y, anchor=NW, fill="white", text=landMass[x][y].elevation)
if color == "green":
self.canvas.create_text(3 + 70 * x, 3 + 50 * y, anchor=NE, fill="red", text=landMass[x][y].vegitation)
elif color == "black":
self.canvas.create_text(3 + 70 * x, 3 + 50 * y, anchor=NE, fill="orange", text=landMass[x][y].quality)
self.canvas.pack(fill=BOTH, expand=1)
def updateMap(self, x, y, action):
color = "grey"
if action == "append":
#DRAW THE CREATURE AT X,Y
elif action == "remove":
#DRAW THE ORIGINAL TILE AT X,Y
...
self.canvas.pack(fill=BOTH, expand=1)
编辑:其他尝试
当我将以下内容添加到Simulation的 init ()并添加一个函数时。整个事情都会运行,但是tk画布会显示最终结果,而不会显示结果。
root = Tk()
root.geometry("800x800+300+300")
self.tkmap = land.Example(root)
root.after(2000, self.runSim)
root.mainloop()
#End of __init__()
def runSim(self):
for generation in range(self.lifeCycles):
self.simulate(generation)
return self.evolve()
答案 0 :(得分:1)
在名为after
的{{1}}中,您可以执行整个模拟。我们的想法是在每次通话后只进行一次(或几次)你的模拟步骤。
以下是它如何运作的一个小例子:
runSim