tkinter制作7x7按钮并在单击时更改颜色

时间:2017-12-15 03:54:27

标签: python button tkinter

我正在为学校编写带有GUI的程序。

我应该写Pah Tum。它在7x7矩阵上播放。我的控制台游戏已经完成并完美运行,但我现在正在与Tkinter进行斗争。

到目前为止,我在__init__函数中定义的帧内部有几帧。

所以现在是第一个问题:

我可以制作这样的7x7电路板:

for x in range(0, 7):
    for y in range(0, 7):
            self.button = Button(self.board, command=self.action)
            self.button.grid(row = x, column = y)

所以我现在要做的是,每当我按下一个按钮时,我想将颜色改为红色(对于玩家1)或蓝色(如果玩家2转过来)。

    self.turn_tracker = 0  # is in __init__

def action(self):
    if self.turn_tracker in range(0, 49, 2):
        self.turn_tracker += 1
        self.button.configure(bg="blue")

    elif self.turn_tracker in range(1, 49, 2):
        self.turn_tracker += 1
        self.button.configure(bg="red")

    elif self.turn_tracker == 49:
        print("game over")
        sys.exit() #calculate

这只会在6x6时更改按钮。 所以我尝试的是分别定义每个按钮,并分别对每个按钮进行更改。你可以想象这看起来真的很丑,但至少可以起作用。

我可以做些什么来提高效率?谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您仍然可以在循环中定义按钮并将不同的命令关联到它们。例如,您可以将按钮存储在7x7矩阵self.buttons中,并使action将行和列作为参数:

def action(self, x, y):
    if self.turn_tracker in range(0, 49, 2):
        self.turn_tracker += 1
        self.buttons[x][y].configure(bg="blue")

    elif self.turn_tracker in range(1, 49, 2):
        self.turn_tracker += 1
        self.buttons[x][y].configure(bg="red")

    elif self.turn_tracker == 49:
        print("game over")

按钮矩阵在__init__

中创建
    self.buttons = []
    for x in range(0, 7):
        self.buttons.append([])
        for y in range(0, 7):
            button = tk.Button(self.board, command=lambda row=x, column=y: self.action(row, column))  
            self.buttons[x].append(button)
            button.grid(row=x, column=y)

我使用lambda row=x, column=y: self.action(row, column)而非直接lambda: self.action(x, y),因为在循环x=6y=6的末尾,所以当我点击按钮时,它将会是最后一个按钮的颜色会改变(见Tkinter assign button command in loop with lambda)。