我在画布上有一些像矩形这样的物体,每一个我都希望有一个集合,其中包含相邻单元格的id
这是类的代码,idC
是我感兴趣的ID,它们由Tkinter的create_rectangle函数分配给每个单元格
class Cell(Rectangle):
def __init__(self, canvas, row, column):
# make a 10x10 rectangle in the given row, column
x0 = column * 10
y0 = row * 10
x1 = x0 + 10
y1 = y0 + 10
super(Cell, self).__init__(canvas, (x0, y0, x1, y1), "white")
self.get_neighbours()
state = 'dead'
neighbours = set()
border = set()
def get_neighbours(self):
if self.idC % 95 == 1: self.border.add('left') #the numbers are like so because my canvas is 950x950
if self.idC % 95 == 0: self.border.add('right')
if self.idC < 96: self.border.add('top')
if self.idC > 8930: self.border.add('bottom')
if 'left' not in self.border: self.neighbours.add(self.idC - 1)
if 'right' not in self.border:self.neighbours.add(self.idC + 1)
if 'top' not in self.border:
if 'left' not in self.border:self.neighbours.add(self.idC - 94)
self.neighbours.add(self.idC - 95)
if 'right' not in self.border:self.neighbours.add(self.idC - 96)
if 'bottom' not in self.border:
if 'left' not in self.border:self.neighbours.add(self.idC + 94)
self.neighbours.add(self.idC + 95)
if 'right' not in self.border:self.neighbours.add(self.idC + 96)
def change_state(self):
self.state = 'alive' if self.state == 'dead' else 'dead'
color = "black" if self.state == "alive" else "white"
print(self.idC)
print("neighbours:")
#print(self.neighbours)
print(len(self.neighbours))
if not GameOfLife.running: self.canvas.itemconfigure(self.idC, fill=color)
以下是我使用其他小部件创建另一个类中的所有单元格的方法:
for i in range(95):
for p in range(95):
self.organism.append(Cell(c, i, p))
for cell in self.organism:
c.tag_bind(cell.idC, '<ButtonPress-1>', lambda _, x = cell: x.change_state())
所发生的是所有id都被添加到集neighbours
,除了触发函数的那个;其他一切工作正常 - 单击一个单元格正确打印其ID
一定是一些新手的错误,但我不知道出了什么问题......
更新:我发现每个单元格也被标记为在画布上的所有边框上,所以它必须是因为函数被一次又一次地调用它会将所有ID添加到同一个集合中,而不是做出不同的为每个类的实例设置。我尝试从不同的地方调用它,但我仍然得到相同的结果......
答案 0 :(得分:0)
好的,所以我把整个get_neighbours()
以及与之关联的所有变量都移到了父类,现在它运行正常
我仍然不知道它为什么会那样行事