mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
renamed ThemeManage.single_color to _apply_appearance_mode and moved it to baseclass and windows
This commit is contained in:
@@ -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
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user