[+] darken_color_rgb

This commit is contained in:
Maxim Khomutov 2025-03-22 21:45:16 +03:00
parent 949e425a31
commit 311fcf3595

View File

@ -1,5 +1,15 @@
import customtkinter as ctk 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): 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): 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) super().__init__(master, *args, **kwargs)
@ -60,12 +70,12 @@ class CTkTableFrame(ctk.CTkFrame):
header_label.pack(side="left", padx=4, pady=3) header_label.pack(side="left", padx=4, pady=3)
@staticmethod @staticmethod
def __row_enter(frame, e): def __row_enter(frame, e, color="gray40"):
frame.configure(fg_color="gray40") frame.configure(fg_color=color)
@staticmethod @staticmethod
def __row_leave(frame, e): def __row_leave(frame, e, color="gray20"):
frame.configure(fg_color="gray20") frame.configure(fg_color=color)
def _build_row(self, row_index, row_data): def _build_row(self, row_index, row_data):
_need_to_pack = [] _need_to_pack = []
@ -149,6 +159,21 @@ class CTkTableFrame(ctk.CTkFrame):
def edit(self, row_index, new_data=None, color=None, disable=False, **__): def edit(self, row_index, new_data=None, color=None, disable=False, **__):
"""Редактирует строку по индексу.""" """Редактирует строку по индексу."""
def _disable_colors(widget):
widget.unbind("<Enter>")
widget.unbind("<Leave>")
def _disable(widget):
widget.unbind("<Double-1>")
_disable_colors(widget)
def _edit_color(widget, row, color):
_disable_colors(widget)
col_back = darken_color_rgb(color, 30)
widget.bind("<Leave>", lambda e: self.__row_leave(row, e, color))
widget.bind("<Enter>", lambda e: self.__row_enter(row, e, col_back))
if 0 <= row_index < len(self._data): if 0 <= row_index < len(self._data):
row = self._rows[row_index] row = self._rows[row_index]
if new_data: if new_data:
@ -158,14 +183,11 @@ class CTkTableFrame(ctk.CTkFrame):
for i, widget in enumerate(row.winfo_children()): for i, widget in enumerate(row.winfo_children()):
widget.configure(text=str(data[i])) widget.configure(text=str(data[i]))
if color: if color:
for widget in (*row.winfo_children(), row):
_edit_color(widget, row, color)
row.configure(fg_color=color) row.configure(fg_color=color)
if disable: if disable:
def _disable(item): for widget in (*row.winfo_children(), row):
item.unbind("<Double-1>")
item.unbind("<Enter>")
item.unbind("<Leave>")
_disable(row)
for widget in row.winfo_children():
_disable(widget) _disable(widget)
self._rows_settings[row_index] = {"color": color, "disable": disable} self._rows_settings[row_index] = {"color": color, "disable": disable}