0

From https://stackoverflow.com/a/45211583 - code below - how can I get the "Change Color" button to change the color of the last-clicked frame? That is, instead of boxes[0], somehow have a dynamic index.

Things I considered but did not work out:

  1. Adding "metadata" to the Frame (e.g. ttk Frame with 'text' field), but if using ttk then I cannot set bg the same.

  2. Getting event.x/y, which did not help, and x_root/y_root are relative to the top of the screen, not the Python window, so not helpful.

  3. Having a self.last_clicked variable and getter within ManyBoxes class, but not sure how to populate it so here I am...


class Navbar(tk.Frame):
    def __init__(self, parent):
        self.parent = parent
        super().__init__(self.parent)

        tk.Label(self.parent, text='Navbar').pack()

        tk.Button(self.parent, text='Change Color', command=self.change_color).pack()

    def change_color(self):
        # access upwards to MainApp, then down through Main, then ManyBoxes
        self.parent.main.many_boxes.boxes[0].config(bg='black')

class ManyBoxes(tk.Frame):
    def __init__(self, parent):
        self.parent = parent
        super().__init__(self.parent)

        self.boxes = []
        self.create_boxes()

    def button_action(self, e):
        print('%s was clicked' % e.widget['bg'])

    def create_boxes(self):
        colors = ['red', 'green', 'blue', 'yellow']
        c = 0
        for n in range(2):
            for m in range(2):
                box = tk.Frame(self, width=100, height=100, bg=colors[c])
                box.bind('<Button-1>', self.button_action)
                box.grid(row=n, column=m)
                self.boxes.append(box)
                c += 1

class Main(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        self.parent = parent

        self.many_boxes = ManyBoxes(self)
        self.many_boxes.pack()

class MainApp(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        self.navbar = Navbar(self)
        self.navbar.pack(fill=tk.Y)

        self.main = Main(self)
        self.main.pack(fill=tk.BOTH, expand=True)

if __name__ == "__main__":
    root = tk.Tk()
    MainApp(root).pack()
    root.mainloop()
user2725742
  • 398
  • 2
  • 12

0 Answers0