gpt4 book ai didi

python - 如何在Python窗口中制作交互式2D网格?

转载 作者:行者123 更新时间:2023-12-02 07:24:57 25 4
gpt4 key购买 nike

我想测试一些寻路算法,并想创建一个由网格组成的窗口,我可以在单击时拖动鼠标来创建墙壁,然后通过右键单击并拖动来删除它们。我刚刚开始接触计算机科学,并对算法着迷,但我不知道如何为其创建交互式窗口。

可以在此处查看示例网格: A* pathfindind visualisation

最佳答案

解决方案来了。您可以使用 CellGrid.grid 对象中包含的单元格对象列表来应用寻路算法。玩得开心。

from tkinter import *

class Cell():
FILLED_COLOR_BG = "green"
EMPTY_COLOR_BG = "white"
FILLED_COLOR_BORDER = "green"
EMPTY_COLOR_BORDER = "black"

def __init__(self, master, x, y, size):
""" Constructor of the object called by Cell(...) """
self.master = master
self.abs = x
self.ord = y
self.size= size
self.fill= False

def _switch(self):
""" Switch if the cell is filled or not. """
self.fill= not self.fill

def draw(self):
""" order to the cell to draw its representation on the canvas """
if self.master != None :
fill = Cell.FILLED_COLOR_BG
outline = Cell.FILLED_COLOR_BORDER

if not self.fill:
fill = Cell.EMPTY_COLOR_BG
outline = Cell.EMPTY_COLOR_BORDER

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 = fill, outline = outline)

class CellGrid(Canvas):
def __init__(self,master, rowNumber, columnNumber, cellSize, *args, **kwargs):
Canvas.__init__(self, master, width = cellSize * columnNumber , height = cellSize * rowNumber, *args, **kwargs)

self.cellSize = cellSize

self.grid = []
for row in range(rowNumber):

line = []
for column in range(columnNumber):
line.append(Cell(self, column, row, cellSize))

self.grid.append(line)

#memorize the cells that have been modified to avoid many switching of state during mouse motion.
self.switched = []

#bind click action
self.bind("<Button-1>", self.handleMouseClick)
#bind moving while clicking
self.bind("<B1-Motion>", self.handleMouseMotion)
#bind release button action - clear the memory of midified cells.
self.bind("<ButtonRelease-1>", lambda event: self.switched.clear())

self.draw()



def draw(self):
for row in self.grid:
for cell in row:
cell.draw()

def _eventCoords(self, event):
row = int(event.y / self.cellSize)
column = int(event.x / self.cellSize)
return row, column

def handleMouseClick(self, event):
row, column = self._eventCoords(event)
cell = self.grid[row][column]
cell._switch()
cell.draw()
#add the cell to the list of cell switched during the click
self.switched.append(cell)

def handleMouseMotion(self, event):
row, column = self._eventCoords(event)
cell = self.grid[row][column]

if cell not in self.switched:
cell._switch()
cell.draw()
self.switched.append(cell)


if __name__ == "__main__" :
app = Tk()

grid = CellGrid(app, 50, 50, 10)
grid.pack()

app.mainloop()

关于python - 如何在Python窗口中制作交互式2D网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com