Button gpio full app

#!/home/user_name/project/venv/bin/python3.11

import tkinter as tk
import tkinter.font as TkFont
import RPi.GPIO as GPIO


# Setup GPIO
class GPIOController:
    def __init__(self):
        self.pins = {
            24: GPIO.HIGH,
            18: GPIO.LOW,
            21: GPIO.LOW,
            12: GPIO.LOW
        }
        GPIO.setmode(GPIO.BCM)
        for pin, state in self.pins.items():
            GPIO.setup(pin, GPIO.OUT)
            GPIO.output(pin, state)

    def toggle_pin(self, pin):
        current_state = GPIO.input(pin)
        new_state = GPIO.LOW if current_state else GPIO.HIGH
        GPIO.output(pin, new_state)
        return new_state

    def cleanup(self):
        GPIO.cleanup()


class ControlPanelApp:
    def __init__(self, master, gpio_controller):
        self.master = master
        self.gpio_controller = gpio_controller
        self.master.geometry('400x400')
        self.master.title("CONTROL PANEL")
        self.master.configure(bg="black")
        self.master.protocol("WM_DELETE_WINDOW", self.close)

        self.frame_top = tk.Frame(self.master, bg="black", bd=5, relief=tk.SUNKEN)
        self.frame_top.pack(fill=tk.X, side=tk.TOP)

        self.btn_close = tk.Button(self.frame_top, text="✖", bg="red", fg="white", width=3, command=self.close)
        self.btn_close.pack(side=tk.RIGHT, padx=2)

        self.frame = tk.Frame(self.master, bg="black", bd=5, relief=tk.SUNKEN)
        self.frame.pack()

        self.myFont = TkFont.Font(family='Helvetica', size=36, weight='bold')

        # Create buttons and store them
        self.btn1 = self.create_button("LED1", 24)
        self.btn2 = self.create_button("LED2", 18)
        self.btn3 = self.create_button("LED3", 21)
        self.btn4 = self.create_button("LED4", 12)

        self.close_button = tk.Button(self.frame, text="Close", font=("consolas", 18), width=15, height=2,
                                      bg="#003333", fg="green", activeforeground="white",
                                      activebackground="black", command=self.close)
        self.close_button.pack()

    def create_button(self, label, pin):
        button = tk.Button(self.frame, text=label, font=self.myFont,
                           command=lambda: self.toggle_led(pin), height=1, width=8,
                           bg='#003333', fg="green", activeforeground="#00ff00", activebackground="black")
        button.pack()
        return button

    def toggle_led(self, pin):
        new_state = self.gpio_controller.toggle_pin(pin)

        # Map pin to button
        if pin == 24:
            button = self.btn1
        elif pin == 18:
            button = self.btn2
        elif pin == 21:
            button = self.btn3
        elif pin == 12:
            button = self.btn4
        else:
            return

        button["text"] = f"LED{pin} {'ON' if new_state else 'OFF'}"

    def close(self):
        self.gpio_controller.cleanup()
        self.master.destroy()


def main():
    gpio_controller = GPIOController()
    root = tk.Tk()
    app = ControlPanelApp(root, gpio_controller)
    root.mainloop()


if __name__ == "__main__":
    main()