1

我正在使用 tkinter 作为我的可视化工具在 python 2.7 中运行生物模拟器。地图由正方形组成,颜色代表土地类型,红色正方形代表生物。我使用canvas.move,在棋盘上移动那个红色方块。它必须移动很多。但我确切地知道它应该从哪里开始,它应该在哪里结束。我已经一点一点地运行了模拟,当它被调节到可能有两个动作时,即。sim 并没有真正运行我只是在测试它。我可以看到动作。但是当我真正运行模拟时,一切都在嗡嗡作响,我能在画布上看到的只有地图,但没有生物,当然也没有生物运动。所以我的问题是这个。首先,我怎样才能放慢这个过程,以便我可以看到动作?或者为什么模拟会运行并现在显示任何 tkinter?

模拟非常大,很难只挑出重要的部分,所以下面的代码更多的是简化。但它与我做 tkinter 的方式相匹配。我的 sim 只是添加了更多的计算和循环。值得注意的是,此示例完美运行。

驱动程序.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()

动画.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)
4

1 回答 1

0

您可以使用 tkinters 方法减慢该过程after,任何不同的小部件都可以使用该方法。

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

于 2013-07-24T02:14:57.260 回答