Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
import os
import customtkinter as ctk
from PIL import Image

# Appearance and Theme set up
ctk.set_appearance_mode('Dark')

# STATIC PATHS
SETTINGS_PATH = os.path.expanduser('~/.config/kbd_settings/')
if not os.path.exists(SETTINGS_PATH):
    os.makedirs(SETTINGS_PATH)
# RGB
# generic path
DRIVER_PATH = '/sys/class/leds'
TEST_PATH = 'rgb:kbd_backlight_1'
TEST_PATH_FULL = os.path.join(DRIVER_PATH, TEST_PATH)

KEYBOARD_PATH = DRIVER_PATH + '/rgb:kbd_backlight'

BRIGHTNESS_PATH_FILE = KEYBOARD_PATH + '/brightness'
LOCAL_BRIGHTNESS_PATH_FILE = os.path.expanduser('~/.config/kbd_settings/user_brightness')
if not os.path.exists(LOCAL_BRIGHTNESS_PATH_FILE):
    with open(LOCAL_BRIGHTNESS_PATH_FILE, 'w') as file:
        if not os.path.exists(TEST_PATH_FULL):
            file.write('25')
        else:
            file.write('3')

COLOR_PATH_FILE = KEYBOARD_PATH + '/multi_intensity'
LOCAL_COLOR_PATH_FILE = os.path.expanduser('~/.config/kbd_settings/user_color')
if not os.path.exists(LOCAL_COLOR_PATH_FILE):
    with open(LOCAL_COLOR_PATH_FILE, 'w') as file:
        file.write('')

# RGB PER KEY
RGB_LOCAL_COLOR_PATH_FILE = os.path.expanduser('~/.config/kbd_settings/user_rgb_color')
if not os.path.exists(RGB_LOCAL_COLOR_PATH_FILE):
    with open(RGB_LOCAL_COLOR_PATH_FILE, 'w') as file:
        file.write('')

img_blue = ctk.CTkImage(Image.open(r'colors/blue.png'), size=(35, 25))
img_cyan = ctk.CTkImage(Image.open(r'colors/cyan.png'), size=(35, 25))
img_green = ctk.CTkImage(Image.open(r'colors/green.png'), size=(35, 25))
img_yellow = ctk.CTkImage(Image.open(r'colors/yellow.png'), size=(35, 25))
img_red = ctk.CTkImage(Image.open(r'colors/red.png'), size=(35, 25))
img_magenta = ctk.CTkImage(Image.open(r'colors/magenta.png'), size=(35, 25))
img_white = ctk.CTkImage(Image.open(r'colors/white.png'), size=(35, 25))


# Main window
def update_brightness(value):
    # Update the brightness value
    local_brightness = int(value)
    with open(LOCAL_BRIGHTNESS_PATH_FILE, 'w') as f:
        f.write(str(local_brightness))
    with open(LOCAL_BRIGHTNESS_PATH_FILE, 'r') as k:
        brightness = str(k.read())
    with open(BRIGHTNESS_PATH_FILE, 'w') as g:
        g.write(str(brightness))


def set_color(r, g, b):
    if not os.path.exists(TEST_PATH_FULL):
        with open(LOCAL_COLOR_PATH_FILE, 'w') as f:
            f.write(str(f'{r} {g} {b}'))
        with open(COLOR_PATH_FILE, 'w') as f:
            f.write(str(f'{r} {g} {b}'))
    else:
        # Iterate over folders starting with 'kbd:'
        for folder_name in os.listdir(DRIVER_PATH):
            if folder_name.startswith('rgb:kbd_backlight'):
                folder_path_kbd = os.path.join(DRIVER_PATH, folder_name)
                file_path = os.path.join(folder_path_kbd, 'multi_intensity')

                with open(file_path, 'w') as file:
                    file.write(f'{r} {g} {b}')

        with open(RGB_LOCAL_COLOR_PATH_FILE, 'w') as f:
            f.write(str(f'{r} {g} {b}'))


# def save_settings():
#     with open(BRIGHTNESS_PATH_FILE, 'r') as f:
#         brightness = int(f.read())
#     with open(LOCAL_BRIGHTNESS_PATH_FILE, 'w') as g:
#         g.write(str(f'{brightness}'))
#     with open(COLOR_PATH_FILE, 'r') as f:
#         color = str(f.read())
#     with open(LOCAL_COLOR_PATH_FILE, 'w') as g:
#         g.write(str(f'{color}'))


# def load_color_settings():
#     with open(LOCAL_COLOR_PATH_FILE, 'r') as f:
#         color = str(f.read())
#     with open(COLOR_PATH_FILE, 'w') as g:
#         g.write(str(f'{color}'))


class App(ctk.CTk):
    def __init__(self, brightness_slider=None):
        super().__init__()
        self.title('Keyboard Backlight Controller')
        self.resizable(width=False, height=False)

        with open(LOCAL_BRIGHTNESS_PATH_FILE, 'r') as b:
            brightness = b.read()
        with open(BRIGHTNESS_PATH_FILE, 'w') as b:
            b.write(brightness)

        if not os.path.exists(TEST_PATH_FULL):
            with open(LOCAL_COLOR_PATH_FILE, 'r') as c:
                color = str(c.read())
            with open(COLOR_PATH_FILE, 'w') as c:
                c.write(str(color))
        else:
            with open(RGB_LOCAL_COLOR_PATH_FILE, 'r') as c:
                color = str(c.read())

            for folder_name in os.listdir(DRIVER_PATH):
                if folder_name.startswith('rgb:kbd_backlight'):
                    folder_path_kbd = os.path.join(DRIVER_PATH, folder_name)
                    file_path = os.path.join(folder_path_kbd, 'multi_intensity')

                    with open(file_path, 'w') as file:
                        file.write(f'{color}')

        # ADD WIDGETS
        # Frame - Brightness
        brightness_frame = ctk.CTkFrame(master=self, fg_color='#242424')
        brightness_frame.grid(row=0, column=0, padx=5, pady=5, sticky='nsew')
        # Label - Brightness
        brightness_label = ctk.CTkLabel(master=brightness_frame, text='Brightness: ')
        brightness_label.grid(row=0, column=0, padx=5, pady=5, sticky='nsw')
        # Slider - Brightness - Range 0 to 255
        if not os.path.exists(TEST_PATH_FULL):
            brightness_slider = ctk.CTkSlider(master=brightness_frame, width=222, from_=0, to=255, number_of_steps=256,
                                              button_color='#373737', button_hover_color='#404040',
                                              command=update_brightness)
            brightness_slider.grid(row=0, column=1, padx=(0, 2), pady=5, sticky='nsew')
            brightness_slider.set(int(brightness))
        else:
            brightness_slider = ctk.CTkSlider(master=brightness_frame, width=222, from_=0, to=10, number_of_steps=11,
                                              button_color='#373737', button_hover_color='#404040',
                                              command=update_brightness)
            brightness_slider.grid(row=0, column=1, padx=(0, 2), pady=5, sticky='nsew')
            brightness_slider.set(int(brightness))

        # Frame - Color - main
        color_frame_main = ctk.CTkFrame(master=self, fg_color='#242424')
        color_frame_main.grid(row=1, column=0, padx=5, pady=(5, 0), sticky='nsew')
        # Label - Color
        color_label = ctk.CTkLabel(master=color_frame_main, text='Pick a Color: ')
        color_label.grid(row=0, column=0, padx=5, pady=1, sticky='nw')
        # Frame - Color - sec
        color_frame_sec = ctk.CTkFrame(master=self, fg_color='#242424')
        color_frame_sec.grid(row=2, column=0, padx=5, pady=(0, 5), sticky='nsew')
        # Buttons - Color - 7 default colours
        # Button - Blue
        button_blue = ctk.CTkButton(master=color_frame_sec, image=img_blue, text='', width=35, height=25,
                                    fg_color='#0000ff', hover_color='#404040', corner_radius=1,
                                    command=lambda: set_color(0, 0, 255))
        button_blue.grid(row=0, column=0, padx=(2, 1), pady=5, sticky='nsew')
        # Button - Cyan
        button_cyan = ctk.CTkButton(master=color_frame_sec, image=img_cyan, text='', width=35, height=25,
                                    fg_color='#00ffff', hover_color='#404040', corner_radius=0,
                                    command=lambda: set_color(0, 255, 255))
        button_cyan.grid(row=0, column=1, padx=1, pady=5, sticky='nsew')
        # Button - Green
        button_green = ctk.CTkButton(master=color_frame_sec, image=img_green, text='', width=35, height=25,
                                     fg_color='#00ff00', hover_color='#404040', corner_radius=0,
                                     command=lambda: set_color(0, 255, 0))
        button_green.grid(row=0, column=2, padx=1, pady=5, sticky='nsew')
        # Button - Yellow
        button_yellow = ctk.CTkButton(master=color_frame_sec, image=img_yellow, text='', width=35, height=25,
                                      fg_color='#ffff00', hover_color='#404040', corner_radius=0,
                                      command=lambda: set_color(255, 255, 0))
        button_yellow.grid(row=0, column=3, padx=1, pady=5, sticky='nsew')
        # Button - Red
        button_red = ctk.CTkButton(master=color_frame_sec, image=img_red, text='', width=35, height=25,
                                   fg_color='#ff0000', hover_color='#404040', corner_radius=0,
                                   command=lambda: set_color(255, 0, 0))
        button_red.grid(row=0, column=4, padx=1, pady=5, sticky='nsew')
        # Button - Magenta
        button_magenta = ctk.CTkButton(master=color_frame_sec, image=img_magenta, text='', width=35, height=25,
                                       fg_color='#ff00ff', hover_color='#404040', corner_radius=0,
                                       command=lambda: set_color(255, 0, 255))
        button_magenta.grid(row=0, column=5, padx=1, pady=5, sticky='nsew')
        # Button - White
        button_white = ctk.CTkButton(master=color_frame_sec, image=img_white, text='', width=35, height=25,
                                     fg_color='#ffffff', hover_color='#404040', corner_radius=0,
                                     command=lambda: set_color(255, 255, 255))
        button_white.grid(row=0, column=6, padx=(1, 2), pady=5, sticky='nsew')

        # Reset back to White with 25 brightness
        if not os.path.exists(TEST_PATH_FULL):
            x = 25
        else:
            x = 3

        button_reset = ctk.CTkButton(master=self, fg_color='#373737', hover_color='#404040', text='Reset',
                                     command=lambda: [set_color(255, 255, 255), update_brightness(x), set_slider()])
        button_reset.grid(row=3, column=0, padx=10, pady=10, sticky='e')

        def set_slider():
            with open(LOCAL_BRIGHTNESS_PATH_FILE, 'r') as b:
                brightness = b.read()
            with open(BRIGHTNESS_PATH_FILE, 'w') as b:
                b.write(brightness)
            brightness_slider.set(int(brightness))


app = App()
app.mainloop()