diff --git a/frames/CTkTableFrame.py b/frames/CTkTableFrame.py index 70e8fc7..b45e838 100644 --- a/frames/CTkTableFrame.py +++ b/frames/CTkTableFrame.py @@ -1,5 +1,15 @@ import customtkinter as ctk +def darken_color_rgb(hex_color, amount=30): + """Затемняет цвет, вычитая значение из каждого компонента RGB""" + hex_color = hex_color.lstrip("#") + r, g, b = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) + + # Уменьшаем компоненты, не давая им уйти в минус + r, g, b = max(0, r - amount), max(0, g - amount), max(0, b - amount) + + return f"#{r:02X}{g:02X}{b:02X}" + class CTkTableFrame(ctk.CTkFrame): def __init__(self, master: ctk.CTk | ctk.CTkToplevel, columns, data: list, callback, settings_callback=None, width=400, height=200, *args, **kwargs): super().__init__(master, *args, **kwargs) @@ -60,12 +70,12 @@ class CTkTableFrame(ctk.CTkFrame): header_label.pack(side="left", padx=4, pady=3) @staticmethod - def __row_enter(frame, e): - frame.configure(fg_color="gray40") + def __row_enter(frame, e, color="gray40"): + frame.configure(fg_color=color) @staticmethod - def __row_leave(frame, e): - frame.configure(fg_color="gray20") + def __row_leave(frame, e, color="gray20"): + frame.configure(fg_color=color) def _build_row(self, row_index, row_data): _need_to_pack = [] @@ -149,6 +159,21 @@ class CTkTableFrame(ctk.CTkFrame): def edit(self, row_index, new_data=None, color=None, disable=False, **__): """Редактирует строку по индексу.""" + + def _disable_colors(widget): + widget.unbind("") + widget.unbind("") + + def _disable(widget): + widget.unbind("") + _disable_colors(widget) + + def _edit_color(widget, row, color): + _disable_colors(widget) + col_back = darken_color_rgb(color, 30) + widget.bind("", lambda e: self.__row_leave(row, e, color)) + widget.bind("", lambda e: self.__row_enter(row, e, col_back)) + if 0 <= row_index < len(self._data): row = self._rows[row_index] if new_data: @@ -158,14 +183,11 @@ class CTkTableFrame(ctk.CTkFrame): for i, widget in enumerate(row.winfo_children()): widget.configure(text=str(data[i])) if color: + for widget in (*row.winfo_children(), row): + _edit_color(widget, row, color) row.configure(fg_color=color) if disable: - def _disable(item): - item.unbind("") - item.unbind("") - item.unbind("") - _disable(row) - for widget in row.winfo_children(): + for widget in (*row.winfo_children(), row): _disable(widget) self._rows_settings[row_index] = {"color": color, "disable": disable}