在单独的类中更新tkinter canvas

时间:2013-03-12 02:21:06

标签: python tkinter

现在我在陆地类中有以下代码来打印游戏板。有一个单独的类来保存游戏动作,因此每次在游戏中发生某些事情时,都会调用此函数。此时,该类构建了一个新画布,并且每次都反复销毁旧画布。有没有办法让它只是更新画布而不必去除它。

def printBoard(self):
        master = Tk()

        w = Canvas(master, width=503, height=503)
        w.pack()
        for x, row in enumerate(self.a):
            for y, cell in enumerate(row):
                if self.a[x][y][1] == 'C':
                    w.create_rectangle([3 + 50 * y, 3 + 50 * x, 53 + 50 * y, 53 + 50 * x ], fill="black")
                    w.create_text(3 + 50 * y, 3 + 50 * x, anchor=NW, fill="white", text=self.a[x][y][0][1])
                else:
                    if self.a[x][y][0][0] == 'f':     
                        w.create_rectangle([3 + 50 * y, 3 + 50 * x, 53 + 50 * y, 53 + 50 * x ], fill="green")
                        w.create_text(3 + 50 * y, 3 + 50 * x, anchor=NW, fill="white", text=self.a[x][y][0][1])
                    elif self.a[x][y][0][0] == 'w':
                        w.create_rectangle([3 + 50 * y, 3 + 50 * x, 53 + 50 * y, 53 + 50 * x ], fill="blue")
                        w.create_text(3 + 50 * y, 3 + 50 * x, anchor=NW, fill="white", text=self.a[x][y][0][1])
                    elif self.a[x][y][0][0] == 'X':
                        w.create_rectangle([3 + 50 * y, 3 + 50 * x, 53 + 50 * y, 53 + 50 * x ], fill="brown")
                        w.create_text(3 + 50 * y, 3 + 50 * x, anchor=NW, fill="white", text=self.a[x][y][0][1])
                    elif self.a[x][y][0][0] == 's':
                        w.create_rectangle([3 + 50 * y, 3 + 50 * x, 53 + 50 * y, 53 + 50 * x ], fill="gray")
                        w.create_text(3 + 50 * y, 3 + 50 * x, anchor=NW, fill="white", text=self.a[x][y][0][1])
        master.after(1000, lambda: master.destroy())
        master.mainloop()

1 个答案:

答案 0 :(得分:2)

是的,您可以在创建画布项时存储它们的ID,因此可以使用coords方法和itemconfig更新其位置以更改选项(如填充)颜色)。

# Create
self.ids[x][y] = w.create_rectangle([3 + 50 * y, ...)

# Update
fillcolors = {'f':'green', 'w':'blue', 'X':'brown', 's':'gray'}
fill = "black" if self.a[x][y][1] == 'C' else fillcolors[self.a[x][y][0][0]]
w.coords(self.ids[x][y], [3 + 50 * y, ...)
w.itemconfig(self.ids[x][y], fill=fill)

请注意,有很多重复的代码,因此您可以使用已经映射颜色的辅助字典,然后避免使用嵌套条件。