tkinter Python:单击其他按钮后如何更改按钮颜色?

时间:2021-05-10 14:12:24

标签: python user-interface tkinter

我希望在单击按钮时相邻按钮的颜色发生变化。我正在 tkinter 中为 19x19 棋盘游戏制作 GUI。想象一下像 Mindsweeper 这样的东西,所以整个板子都由按钮组成。我正在使用 python 3.7

这是我的一个简单的 1x2 比赛场地的代码。

import tkinter as tk

def do_something(p):
    p.configure(bg = 'blue')

def personal_do_something(p):
    p.configure(bg = 'blue')
    p1.configure(bg = 'blue')

window = tk.Tk()
frame = tk.Frame(master = window)
frame.pack()
p1 = tk.Button(master = frame, width = 10, height = 5, bg = 'orange', command = lambda:do_something(p1))
p2 = tk.Button(master = frame, width = 10, height = 5, bg = 'khaki', command = lambda:personal_do_something(p2))
p1.pack(side=tk.LEFT)
p2.pack(side=tk.LEFT)
window.mainloop()

开始情况:

start

点击 p1:

p1 clicked

点击 p2:

p2 clicked

当 p1 被点击时,只有 p1 变成蓝色,而不是它的邻居 p2。当 p2 被点击时 p1 和 p2 都会变成蓝色。然而这只是因为 p2 有一个 personal_do_something() 函数才有效。在这个函数中,我明确地告诉 p1 变成蓝色。对于小型 1x2 板,这可能是一种可行的方法,但是当有 19x19 按钮时,我无法为每个按钮编写个人功能。有谁知道我如何编写 1 个始终将直接邻居变为蓝色的通用函数?我假设我必须为按钮添加某种属性,例如坐标,然后搜索所有与相邻坐标匹配的按钮或类似的东西。但我不知道怎么做。

提前致谢:)

1 个答案:

答案 0 :(得分:2)

您可以将这些按钮的引用存储在 2D 列表中,并将所点击按钮的 rowcol 传递给 do_something() 函数。然后您可以根据传递的 rowcol 更新这些按钮的背景颜色。

以下是基于您的代码的示例:

import tkinter as tk

def do_something(row, col):
    buttons[row][col].config(bg="blue")
    # change direct connected buttons (left, right, up, down)
    for dir in (-1, +1):
        if 0 <= row+dir < len(buttons):
            buttons[row+dir][col].config(bg="blue")
        if 0 <= col+dir < len(buttons[row]):
            buttons[row][col+dir].config(bg="blue")

window = tk.Tk()
frame = tk.Frame(window)
frame.pack()

ROWS = 10
COLS = 10

buttons = [[None]*COLS for _ in range(ROWS)] # for storing references of buttons
for row in range(ROWS):
    for col in range(COLS):
        buttons[row][col] = tk.Button(frame, width=10, height=5, bg="orange", command=lambda r=row,c=col: do_something(r,c))
        buttons[row][col].grid(row=row, column=col, sticky="nsew")

window.mainloop()