Tkinter的多个按钮的颜色变化(tkinter Multiple Buttons Colour

2019-09-29 01:22发布

我使用的Tkinter创建一个8×8矩阵按钮,其中,当所述各个按钮被按下添加到最终列表(例如finalList =((0,0),(5,7),(6,6),... ),让我快速创建的8x8(X,Y)坐标图像。我已经创建了按钮的窗口,但现在有问题,试图在函数中引用这些按钮添加到列表中甚至改变的颜色按键

我已阅读,一旦创建按钮,并创建了另一个移动到该按钮参考。 我怀疑我需要使用字典或二维阵列来存储按钮的所有这些引用,但我在努力找出解决方案。

from tkinter import *

class App:

    def updateChange(self):
        '''
        -Have the button change colour when pressed
        -add coordinate to final list
        '''
        x , y = self.xY
        self.buttons[x][y].configure(bg="#000000")

    def __init__(self, master):
        frame = Frame(master)
        frame.pack()

        self.buttons = [] # Do I need to create a dict of button's so I can reference the particular button I wish to update?
        for matrixColumn in range(8):
            for matrixRow in range(8):
                self.xY = (matrixColumn,matrixRow)
                stringXY = str(self.xY)
                self.button = Button(frame,text=stringXY, fg="#000000", bg="#ffffff", command = self.updateChange).grid(row=matrixRow,column=matrixColumn)
                self.buttons[matrixColumn][matrixRow].append(self.button)


root = Tk()
app = App(root)
root.mainloop()

8×8矩阵的例子

Answer 1:

下面是两个例子,第一个是,如果你只是想改变颜色,没有别的,那么你可以不用使用列表。 第二个涉及使用列表并演示了什么Delioth指出

class App(object):
    def __init__(self, master):
        self._master = master

        for col in range(8):
            for row in range(8):
                btn = tk.Button(master, text = '(%d, %d)' % (col, row), bg = 'white')
                btn['command'] = lambda b = btn: b.config(bg = 'black')
                btn.grid(row = row, column = col)

class App(object):
    def __init__(self, master):
        self._master = master
        self._btn_matrix = []

        for col in range(8):
            row_matrix = []
            for row in range(8):
                btn = tk.Button(master, text = '(%d, %d)' % (col, row), bg = 'white',
                                command = lambda x = row, y = col: self.update(x, y))
                btn.grid(row = row, column = col)
                row_matrix.append(btn)
            self._btn_matrix.append(row_matrix)

    def update(self, row, col):
        self._btn_matrix[col][row].config( bg = 'black' )

if __name__ == '__main__':
    root = tk.Tk()
    app = App(root)
    root.mainloop()


Answer 2:

self.xY设置为7,7在你的双for循环和从未改变。 如果你希望它是每个按钮不同,您可能要更改updateChange采取两个参数(X,Y),并通过他们为使用类似按键的命令; lambda x=matrixColumn y=matrixRow: self.updateChange(x,y)

例如updateChange

def updateChange(self, x, y):
    '''...'''
    self.buttons[x][y].configure(bg="black")


文章来源: tkinter Multiple Buttons Colour Change