renamed ThemeManage.single_color to _apply_appearance_mode and moved it to baseclass and windows

This commit is contained in:
Tom Schimansky
2022-10-29 01:20:32 +02:00
parent 08a0835fd0
commit e5484cb6cd
20 changed files with 315 additions and 330 deletions

View File

@@ -0,0 +1,15 @@
from typing import Union, Tuple, List
class CTkAppearanceModeBaseClass:
def __init__(self):
def _apply_appearance_mode(self, color: Union[str, Tuple[str, str], List[str]]) -> str:
""" color can be either a single hex color string or a color name or it can be a
tuple color with (light_color, dark_color). The functions returns
always a single color string """
if type(color) == tuple or type(color) == list:
return color[self._appearance_mode]
else:
return color

View File

@@ -65,24 +65,24 @@ class DropdownMenu(tkinter.Menu):
elif sys.platform.startswith("win"):
super().configure(tearoff=False,
relief="flat",
activebackground=ThemeManager.single_color(self._hover_color, self._appearance_mode),
activebackground=ThemeManager._apply_appearance_mode(self._hover_color, self._appearance_mode),
borderwidth=self._apply_widget_scaling(4),
activeborderwidth=self._apply_widget_scaling(4),
bg=ThemeManager.single_color(self._fg_color, self._appearance_mode),
fg=ThemeManager.single_color(self._text_color, self._appearance_mode),
activeforeground=ThemeManager.single_color(self._text_color, self._appearance_mode),
bg=ThemeManager._apply_appearance_mode(self._fg_color, self._appearance_mode),
fg=ThemeManager._apply_appearance_mode(self._text_color, self._appearance_mode),
activeforeground=ThemeManager._apply_appearance_mode(self._text_color, self._appearance_mode),
font=self._apply_font_scaling(self._font),
cursor="hand2")
else:
super().configure(tearoff=False,
relief="flat",
activebackground=ThemeManager.single_color(self._hover_color, self._appearance_mode),
activebackground=ThemeManager._apply_appearance_mode(self._hover_color, self._appearance_mode),
borderwidth=0,
activeborderwidth=0,
bg=ThemeManager.single_color(self._fg_color, self._appearance_mode),
fg=ThemeManager.single_color(self._text_color, self._appearance_mode),
activeforeground=ThemeManager.single_color(self._text_color, self._appearance_mode),
bg=ThemeManager._apply_appearance_mode(self._fg_color, self._appearance_mode),
fg=ThemeManager._apply_appearance_mode(self._text_color, self._appearance_mode),
activeforeground=ThemeManager._apply_appearance_mode(self._text_color, self._appearance_mode),
font=self._apply_font_scaling(self._font))
def _add_menu_commands(self):
@@ -120,15 +120,15 @@ class DropdownMenu(tkinter.Menu):
def configure(self, **kwargs):
if "fg_color" in kwargs:
self._fg_color = kwargs.pop("fg_color")
super().configure(bg=ThemeManager.single_color(self._fg_color, self._appearance_mode))
super().configure(bg=ThemeManager._apply_appearance_mode(self._fg_color, self._appearance_mode))
if "hover_color" in kwargs:
self._hover_color = kwargs.pop("hover_color")
super().configure(activebackground=ThemeManager.single_color(self._hover_color, self._appearance_mode))
super().configure(activebackground=ThemeManager._apply_appearance_mode(self._hover_color, self._appearance_mode))
if "text_color" in kwargs:
self._text_color = kwargs.pop("text_color")
super().configure(fg=ThemeManager.single_color(self._text_color, self._appearance_mode))
super().configure(fg=ThemeManager._apply_appearance_mode(self._text_color, self._appearance_mode))
if "font" in kwargs:
if isinstance(self._font, CTkFont):

View File

@@ -2,7 +2,8 @@ import sys
import tkinter
import tkinter.ttk as ttk
import copy
from typing import Union, Callable, Tuple
from typing import Union, Callable, Tuple, List
from abc import ABC, abstractmethod
try:
from typing import TypedDict
@@ -15,12 +16,11 @@ from ...appearance_mode_tracker import AppearanceModeTracker
from ...scaling_tracker import ScalingTracker
from ...theme_manager import ThemeManager
from ..font.ctk_font import CTkFont
from ..image.ctk_image import CTkImage
from ...utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty
class CTkBaseClass(tkinter.Frame):
class CTkBaseClass(tkinter.Frame, ABC):
""" Base class of every CTk widget, handles the dimensions, _bg_color,
appearance_mode changes, scaling, bg changes of master if master is not a CTk widget """
@@ -69,7 +69,7 @@ class CTkBaseClass(tkinter.Frame):
# background color
self._bg_color: Union[str, Tuple[str, str]] = self._detect_color_of_master() if bg_color is None else bg_color
super().configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode))
super().configure(bg=self._apply_appearance_mode(self._bg_color))
super().bind('<Configure>', self._update_dimensions_event)
# overwrite configure methods of master when master is tkinter widget, so that bg changes get applied on child CTk widget as well
@@ -93,9 +93,9 @@ class CTkBaseClass(tkinter.Frame):
self.master.config = new_configure
self.master.configure = new_configure
@abstractmethod
def _draw(self, no_color_updates: bool = False):
""" abstract of draw method to be overridden """
pass
return
def config(self, *args, **kwargs):
raise AttributeError("'config' is not implemented for CTk widgets. For consistency, always use 'configure' instead.")
@@ -200,7 +200,7 @@ class CTkBaseClass(tkinter.Frame):
elif mode_string.lower() == "light":
self._appearance_mode = 0
super().configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode))
super().configure(bg=self._apply_appearance_mode(self._bg_color))
self._draw()
def _set_scaling(self, new_widget_scaling, new_window_scaling):
@@ -265,6 +265,16 @@ class CTkBaseClass(tkinter.Frame):
return scaled_kwargs
def _apply_appearance_mode(self, color: Union[str, Tuple[str, str], List[str]]) -> str:
""" color can be either a single hex color string or a color name or it can be a
tuple color with (light_color, dark_color). The functions returns
always a single color string """
if type(color) == tuple or type(color) == list:
return color[self._appearance_mode]
else:
return color
def destroy(self):
""" Destroy this and all descendants widgets. """
AppearanceModeTracker.remove(self._set_appearance_mode)