import asyncio import tkinter as tk from tkinter import ttk import json from async_tkinter_loop import async_handler, async_mainloop from networking import send_to_server import color_utils bg_color = "#2e2e2e" class App: def __init__(self) -> None: self.root = tk.Tk() self.root.attributes('-fullscreen', True) self.root.configure(bg=bg_color) # Set background color # List of servers (IP, Port) self.lightgroups = { "light1": {"ids": [0], "settings": {"color": "#00ff00"}}, "light2": {"ids": [0], "settings": {"color": "#ff0000"}} } # Create Notebook for tabs self.notebook = ttk.Notebook(self.root) self.notebook.pack(expand=1, fill="both") # Create a tab for each server self.tabs = {} for key, value in self.lightgroups.items(): tab = ttk.Frame(self.notebook) self.notebook.add(tab, text=key) self.create_sliders(tab) self.tabs[key] = tab async_mainloop(self.root) def create_sliders(self, tab): """Create sliders for each tab.""" slider_length = 800 slider_width = 50 # Red Slider red_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Red") red_slider.set(0) red_slider.pack(side=tk.LEFT, padx=10) red_slider.bind("", lambda _: self.update_colour(tab)) # Green Slider green_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Green") green_slider.set(0) green_slider.pack(side=tk.LEFT, padx=10) green_slider.bind("", lambda _: self.update_colour(tab)) # Blue Slider blue_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Blue") blue_slider.set(0) blue_slider.pack(side=tk.LEFT, padx=10) blue_slider.bind("", lambda _: self.update_colour(tab)) # Brightness Slider brightness_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Brightness") brightness_slider.set(127) brightness_slider.pack(side=tk.LEFT, padx=10) brightness_slider.bind("", lambda _: self.update_colour(tab)) tab.widgets = { 'red_slider': red_slider, 'green_slider': green_slider, 'blue_slider': blue_slider, 'brightness_slider': brightness_slider, } @async_handler async def update_colour(self, tab): """Update color based on the slider values and send to the selected server.""" try: # Retrieve slider values red_slider = tab.widgets['red_slider'] green_slider = tab.widgets['green_slider'] blue_slider = tab.widgets['blue_slider'] brightness_slider = tab.widgets['brightness_slider'] r = red_slider.get() g = green_slider.get() b = blue_slider.get() brightness = brightness_slider.get() # Adjust brightness color = color_utils.adjust_brightness((r, g, b), brightness) print(f"Adjusted color: {color}, Brightness: {brightness}") # Convert RGB to hex color hex_color = f"#{color[0]:02x}{color[1]:02x}{color[2]:02x}" # Get the selected server selected_server = self.notebook.tab(self.notebook.select(), "text") ids = self.lightgroups[selected_server]["ids"] # Construct WebSocket payload payload = { "save": True, "ids": [0], "settings": { "colors": [hex_color], # Use the dynamically calculated hex color "brightness": brightness, # Use the brightness slider value "pattern": "on" } } # Send the payload to the server await send_to_server(payload) print(f"Sent payload: {payload}") except Exception as e: print(f"Error updating color: {e}") # Optionally, display the error in the GUI if __name__ == "__main__": app = App()