【发布时间】:2015-08-31 04:22:23
【问题描述】:
我编写了一个 A* 搜索算法,并希望使用 tkinter 以图形方式可视化搜索(实时),如下图所示,只是一个更简单的版本,没有菜单、单元格中的数字、以前尝试过的路径或对角线路径.
换句话说,我只需要显示一个网格,其中包含 7 种可能的纹理(开始、结束、路径、障碍物、开放节点、封闭节点、未尝试),当底层矩阵更改时会自动更新。
可以说,这个外观的轮廓或架构如何?我已经有一个 2x2 矩阵,其中包含每个节点状态的值(开始.. 障碍等),如何在每次更改时使用 tkinter 显示该矩阵?
到目前为止,我得到了这个:
def main():
theMap = .. # initial map with start, finish and obstacles
root = Tk()
my_gui = CellGrid(root,n,m,40,theMap)
root.mainloop()
class CellGrid(Canvas):
def __init__(self,master, rowNumber, columnNumber, cellSize, theMap):
Canvas.__init__(self, master, width = cellSize * columnNumber , height = cellSize * rowNumber)
self.cellSize = cellSize
self.grid = []
for row in range(rowNumber):
line = []
for column in range(columnNumber):
line.append(Cell(self, column, row, cellSize, theMap[row][column]))
self.grid.append(line)
print self.grid[0][0].value
self.draw()
def draw(self):
for row in self.grid:
for cell in row:
cell.draw()
class Cell():
START_COLOR = "green"
FINISH_COLOR = "red"
UNTRIED_COLOR = "white"
CLOSED_COLOR = "gray"
OPEN_COLOR = "blue"
OBSTACLE_COLOR = "black"
PATH_COLOR = "orange"
def __init__(self, master, x, y, size, value):
self.master = master
self.abs = x
self.ord = y
self.size= size
self.fill = "white"
self.value = value
def setValue(self, value):
self.value = value
def draw(self):
""" order to the cell to draw its representation on the canvas """
if self.master != None :
if self.value == 0:
self.fill = self.UNTRIED_COLOR
elif self.value == 1:
self.fill = self.OBSTACLE_COLOR
elif self.value == 2:
self.fill = self.START_COLOR
elif self.value == 3:
self.fill = self.FINISH_COLOR
elif self.value == 4:
self.fill = self.OPEN_COLOR
elif self.value == 5:
self.fill = self.CLOSED_COLOR
elif self.value == 6:
self.fill = self.PATH_COLOR
xmin = self.abs * self.size
xmax = xmin + self.size
ymin = self.ord * self.size
ymax = ymin + self.size
self.master.create_rectangle(xmin, ymin, xmax, ymax, fill = self.fill, outline = "black")
这个想法是绘制仅包含开始、结束和障碍节点的初始地图(theMap)。然后,当 A* 更改节点时,它可以调用 CellGrid 中的一个方法,为该节点提供一个新值,然后更新该值并绘制相应的纹理。
但是我无法做到这一点。当我运行上面的代码时,我什么也得不到,只是一个空的 Tk 窗口。它有什么问题?
【问题讨论】: