Python,tkinter与模拟一起运行

时间:2013-05-31 14:19:04

标签: python tkinter

我有一个模拟,创建在地图周围移动。地图用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()

1 个答案:

答案 0 :(得分:1)

在名为after的{​​{1}}中,您可以执行整个模拟。我们的想法是在每次通话后只进行一次(或几次)你的模拟步骤。

以下是它如何运作的一个小例子:

runSim