Tkinter with Python 3.3 : Change colour of button on click
Question: So I have been playing with tkinter to try add a gui to a lift simulator
project I have written for university. It is not really needed, but I would
like to add it.

Here is the code that I currently have.

    
    
    import tkinter as tk
    
    class Application(tk.Frame):
        def __init__(self, master=None):
            tk.Frame.__init__(self, master)
            master.title("Test") #Controls the window title.
            self.pack()
            self.createWidgets()
    
    
        def createWidgets(self):
            floors = [i for i in range(41)]
            buttons = []
            xPos = 0
            yPos = 0
            for floor in floors:
                if(yPos == 5):
                    xPos = xPos + 1
                    yPos = 0
                if(xPos == 8):
                    yPos = 2
                self.button = tk.Button(self, width=3, text=floor, 
                    command = lambda f=floor: self.pressed(f))
                self.button.grid(row=xPos, column =yPos)
                yPos = yPos +1
    
            self.QUIT = tk.Button(self, text="QUIT", fg="red",
                        command=root.destroy).grid(row = xPos, column = yPos)
    
        def pressed(self, index):
            print("number pressed", index)
            self.button.configure(bg = "red")
    
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()
    

This is all fine and dandy other than when the button is pressed it prints out
the correct number, but it changes the background of the last button (number
40) to red, not the one pressed.

If you could let me know what needs correcting that would be great.

Thanks


Answer: `self.button` can only ever reference a single button, and it will always be
whatever was assigned to it last. A simple solution is to store the button
references in a dict, using `floor` as the key. Since you're passing that to
the callback, you then have everything you need to reconfigure the button:

    
    
    def createWidgets(self):
        ...
        self.buttons = {}
        for floor in floors:
            ...
            self.buttons[floor] = tk.Button(...)
        ...
    def pressed(self, index):
        ...
        self.buttons[index].configure(bg="red")
    

