我希望在单击按钮时相邻按钮的颜色发生变化。我正在 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()
开始情况:
点击 p1:
点击 p2:
当 p1 被点击时,只有 p1 变成蓝色,而不是它的邻居 p2。当 p2 被点击时 p1 和 p2 都会变成蓝色。然而这只是因为 p2 有一个 personal_do_something() 函数才有效。在这个函数中,我明确地告诉 p1 变成蓝色。对于小型 1x2 板,这可能是一种可行的方法,但是当有 19x19 按钮时,我无法为每个按钮编写个人功能。有谁知道我如何编写 1 个始终将直接邻居变为蓝色的通用函数?我假设我必须为按钮添加某种属性,例如坐标,然后搜索所有与相邻坐标匹配的按钮或类似的东西。但我不知道怎么做。
提前致谢:)
答案 0 :(得分:2)
您可以将这些按钮的引用存储在 2D 列表中,并将所点击按钮的 row
和 col
传递给 do_something()
函数。然后您可以根据传递的 row
和 col
更新这些按钮的背景颜色。
以下是基于您的代码的示例:
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()