tkinter多个按钮颜色变化

时间:2016-07-05 20:31:11

标签: python python-3.x button tkinter command

我使用tkinter创建一个8x8按钮矩阵,当按下各个按钮时添加到最终列表(例如finalList =((0,0),(5,7),(6,6) ),...),允许我快速创建8x8(x,y)坐标图像。我已经创建了带按钮的窗口但现在有问题尝试在函数中引用这些按钮以添加到列表甚至更改按钮的颜色

我已经读过,一旦创建了按钮并且您创建了另一个按钮,它就会移动到该按钮引用。我怀疑我需要使用dict或2D数组存储所有这些按钮的引用,但我很难找到解决方案。

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()

Example of the 8x8 Matrix

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

在你的double for循环中

self.xY设置为7,7并且从未更改过。如果您希望每个按钮的不同,您可能需要更改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")