GUI - tkinter:如何访问特定按钮的参数?

GUI - tkinter : how to access parameters of specific buttons?

像许多其他 python 初学者一样,我正在使用 GUI (tkinter)。对于我的小项目,我想创建一个 5x5 按钮的网格,即总共 25 个按钮,并与它们交互:当您单击这 25 个按钮中的任何一个时,一些按钮会在单击的按钮周围发生变化。 我不会详细说明我想要的最终结果是什么,除非您认为它是相关的。您会在下面找到专门针对此问题改编的代码片段。

问题是:

在这种情况下,如何使某些特定按钮对按下另一个按钮的事件做出反应?

添加了有关这种情况的更多信息,我将这样表述我的问题:

给定由 for 循环生成的 25 个按钮的数组,如何定位特定按钮以便与其参数交互(例如:参数 'bg'。一个按钮被点击,另一个改变颜色),考虑到这些按钮没有存储到允许显式访问的变量中(例如:butt = tk.Button(...)。更改 butt 的参数很容易,因为小部件是显式分配的到一个变量。这里,没有变量赋值,只是小部件的迭代创建)

找了很久都没有找到答案,肯定是找错了方向

如果您 运行 下面的代码,您将得到一个 5x5 的按钮网格。我想要的是,例如,如果我单击任何按钮,所有周围的按钮都会将它们的背景颜色更改为绿色。

import tkinter as tk

# --- functions ---

def draw_board():
    frame_board = tk.Frame(root)
    frame_board.pack()

    def callback(button):
        button['relief'] = 'sunken'
        button['bg'] = 'lightgrey'
        button['state'] = 'disabled'

    def draw_tile(container, number):
        tile_1 = tk.Button(container,
                           text='1',
                           width=6,
                           height=3,
                           relief='sunken',
                           bg='lightgrey',
                           state='disabled')
        tiles = tk.Button(container,
                          text='?',
                          command=lambda: callback(tiles),
                          width=6,
                          height=3)
        if number == 1:
            return tile_1
        else:
            return tiles

    r, c = 0, 0

    for i in range(1,26):
        c += 1
        if i in range(1,26,5):
            r += 1
            c = 0
            draw_tile(frame_board, i).grid(row=r,
                                           column=c,
                                           sticky='wens',
                                           padx=10,
                                           pady=10)
        else:
            draw_tile(frame_board, i).grid(row=r,
                                           column=c,
                                           sticky='wens',
                                           padx=10,
                                           pady=10)
# --- main ---

root = tk.Tk()
root.geometry('400x400')

start_button = tk.Button(root,
                         text='START',
                         command=draw_board)
start_button.place(relx=.5,
                   rely=.5,
                   anchor='center')

root.mainloop()

这是我关于 SO 的第一个问题,所以请告诉我它是否不完整,或者是否需要更精确。我试图让代码比我正在处理的代码更轻,但如果需要我可以让它更简单(我认为)

谢谢!

编辑:如果您在我的代码中看到任何为了 clarity/effectiveness/usage 等而应该修改的内容,请告诉我,即使它没有回答我的棘手问题。

几年前刚开始的​​时候,我实际上问过一个类似的问题:

如果在创建按钮时将它们存储在某个地方会容易得多:

(我也删除了一些冗余代码。)

import tkinter as tk

# --- functions ---

def draw_board(buttons):
    frame_board = tk.Frame(root)
    frame_board.pack()

    def surround(buttons, num):
        edges = {'N': list(range(0,5)), 'E': list(range(4,25,5)),
                       'S': list(range(20,25)), 'W': list(range(0,25,5))}

        encircle = {'N':-5, 'NE':-4, 'E':1, 'SE':6, 'S':5, 'SW':4, 'W':-1, 'NW':-6}
        for direction in edges:
           # determine if selected button is on an edge
           if num in edges[direction]:
              # if button is on an edge, set encircle direction False
              for d in encircle:
                 if direction in d:
                    encircle[d] = False

        for key, val in encircle.items():
           if val: # check that its not False
              buttons[num + val].config(bg = 'green')

    def callback(buttons, num):
        buttons[num].config(relief = 'sunken', bg = 'lightgrey', state = 'disabled')
        surround(buttons, num)

    def draw_tile(container, buttons, number):
        tile = tk.Button(container, text='?', width=6, height=3,
                                 command=lambda num=number: callback(buttons, num))
        return tile

    r, c = 0, 0
    for i in range(0,25):
        c += 1
        buttons.append(draw_tile(frame_board, buttons, i)) # append button 
        if i in range(0,25,5):
            r += 1
            c = 0
        # grid last button in list
        buttons[-1].grid(row=r, column=c, sticky='wens', padx=10, pady=10)

# --- main ---

root = tk.Tk()
root.geometry('400x400')

buttons = [] # declare list

start_button = tk.Button(root, text='START',
                                      command=lambda:draw_board(buttons))
start_button.place(relx=.5, rely=.5, anchor='center')

root.mainloop()

现在 buttons 是一个包含每个按钮的列表,您可以使用 buttons[0].config() 方法编辑它们的属性