added different default color themes

This commit is contained in:
Tom Schimansky 2022-01-08 00:29:53 +01:00
parent 2fa7a519ea
commit daf64a12b4
16 changed files with 142 additions and 105 deletions

View File

@ -55,26 +55,5 @@ def get_appearance_mode():
return "Dark"
def deactivate_threading():
AppearanceModeTracker.init_listener_function(no_thread=True)
sys.stderr.write("WARNING (customtkinter.deactivate_threading): Automatic threaded search for a change of the " +
"system appearance mode is deativated now.\nYou have to update the appearance mode manually " +
"in your mainloop by calling customtkinter.update_appearance_mode() every time.\n")
def activate_threading():
AppearanceModeTracker.init_listener_function()
def update_appearance_mode():
if isinstance(AppearanceModeTracker.system_mode_listener, SystemAppearanceModeListenerNoThread):
AppearanceModeTracker.system_mode_listener.update()
else:
sys.stderr.write("WARNING (customtkinter.update_theme): no need to call update_appearance_mode, because " +
"customtkinter is constantly searching for a mode change in a background thread.\n")
def set_default_color_theme(color_string):
CTkColorManager.initialize_color_theme(color_string)

View File

@ -13,8 +13,8 @@ class CTkButton(tkinter.Frame):
def __init__(self,
bg_color=None,
fg_color=CTkColorManager.MAIN,
hover_color=CTkColorManager.MAIN_HOVER,
fg_color="CTkColorManager",
hover_color="CTkColorManager",
border_color=None,
border_width=0,
command=None,
@ -22,7 +22,7 @@ class CTkButton(tkinter.Frame):
height=30,
corner_radius=8,
text_font=None,
text_color=CTkColorManager.TEXT,
text_color="CTkColorManager",
text="CTkButton",
hover=True,
image=None,
@ -58,8 +58,8 @@ class CTkButton(tkinter.Frame):
self.configure_basic_grid()
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.fg_color = fg_color
self.hover_color = self.fg_color if hover_color is None else hover_color
self.fg_color = CTkColorManager.MAIN if fg_color == "CTkColorManager" else fg_color
self.hover_color = CTkColorManager.MAIN_HOVER if hover_color == "CTkColorManager" else hover_color
self.border_color = border_color
self.width = width
@ -80,7 +80,7 @@ class CTkButton(tkinter.Frame):
self.inner_corner_radius = 0
self.text = text
self.text_color = text_color
self.text_color = CTkColorManager.TEXT if text_color == "CTkColorManager" else text_color
if text_font is None:
if sys.platform == "darwin": # macOS
self.text_font = ("Avenir", 13)
@ -516,18 +516,23 @@ class CTkButton(tkinter.Frame):
def on_enter(self, event=0):
if self.hover is True:
if self.hover_color is None:
inner_parts_color = self.fg_color
else:
inner_parts_color = self.hover_color
# set color of inner button parts to hover color
self.canvas.itemconfig("inner_parts",
outline=CTkColorManager.single_color(self.hover_color, self.appearance_mode),
fill=CTkColorManager.single_color(self.hover_color, self.appearance_mode))
outline=CTkColorManager.single_color(inner_parts_color, self.appearance_mode),
fill=CTkColorManager.single_color(inner_parts_color, self.appearance_mode))
# set text_label bg color to button hover color
if self.text_label is not None:
self.text_label.configure(bg=CTkColorManager.single_color(self.hover_color, self.appearance_mode))
self.text_label.configure(bg=CTkColorManager.single_color(inner_parts_color, self.appearance_mode))
# set image_label bg color to button hover color
if self.image_label is not None:
self.image_label.configure(bg=CTkColorManager.single_color(self.hover_color, self.appearance_mode))
self.image_label.configure(bg=CTkColorManager.single_color(inner_parts_color, self.appearance_mode))
def on_leave(self, event=0):
if self.hover is True:

View File

@ -12,15 +12,15 @@ class CTkCheckBox(tkinter.Frame):
def __init__(self,
bg_color=None,
fg_color=CTkColorManager.MAIN,
hover_color=CTkColorManager.MAIN_HOVER,
border_color=CTkColorManager.CHECKBOX_LINES,
fg_color="CTkColorManager",
hover_color="CTkColorManager",
border_color="CTkColorManager",
border_width=3,
width=25,
height=25,
corner_radius=4,
text_font=None,
text_color=CTkColorManager.TEXT,
text_color="CTkColorManager",
text="CTkCheckBox",
hover=True,
command=None,
@ -53,9 +53,9 @@ class CTkCheckBox(tkinter.Frame):
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.fg_color = CTkColorManager.MAIN if fg_color is None else fg_color
self.hover_color = CTkColorManager.MAIN_HOVER if hover_color is None else hover_color
self.border_color = border_color
self.fg_color = CTkColorManager.MAIN if fg_color == "CTkColorManager" else fg_color
self.hover_color = CTkColorManager.MAIN_HOVER if hover_color == "CTkColorManager" else hover_color
self.border_color = CTkColorManager.CHECKBOX_LINES if border_color == "CTkColorManager" else border_color
self.width = width
self.height = height
@ -74,7 +74,7 @@ class CTkCheckBox(tkinter.Frame):
self.inner_corner_radius = 0
self.text = text
self.text_color = text_color
self.text_color = CTkColorManager.TEXT if text_color == "CTkColorManager" else text_color
if text_font is None:
if sys.platform == "darwin": # macOS
self.text_font = ("Avenir", 13)

View File

@ -3,18 +3,68 @@ import sys
class CTkColorManager:
WINDOW_BG = ("#ECECEC", "#323232") # macOS standard light and dark window bg colors
MAIN = ("#1C94CF", "#1C94CF")
MAIN_HOVER = ("#5FB4DD", "#5FB4DD")
ENTRY = ("white", "#222222")
TEXT = ("black", "white")
SLIDER_BG = ("#6B6B6B", "#222222")
PROGRESS_BG = ("#6B6B6B", "#222222")
FRAME = ("#D4D5D6", "#3F3F3F")
FRAME_2 = ("#BFBEC1", "#505050")
CHECKBOX_LINES = ("black", "#ededed")
WINDOW_BG = None
MAIN = None
MAIN_HOVER = None
ENTRY = None
TEXT = None
LABEL_BG = None
SLIDER_BG = None
SLIDER_PROGRESS = None
PROGRESS_BG = None
FRAME = None
FRAME_2 = None
CHECKBOX_LINES = None
DARKEN_COLOR_FACTOR = None
DARKEN_COLOR_FACTOR = 0.8 # used to generate color for disabled button
@classmethod
def initialize_color_theme(cls, theme_name):
print("set theme", theme_name)
if theme_name.lower() == "blue":
cls.WINDOW_BG = ("#ECECEC", "#323232") # macOS standard light and dark window bg colors
cls.MAIN = ("#1C94CF", "#1C94CF")
cls.MAIN_HOVER = ("#5FB4DD", "#5FB4DD")
cls.ENTRY = ("white", "#222222")
cls.TEXT = ("black", "white")
cls.LABEL_BG = ("white", "#626061")
cls.SLIDER_BG = ("#6B6B6B", "#222222")
cls.SLIDER_PROGRESS = ("#A5A6A5", "#555555")
cls.PROGRESS_BG = ("#6B6B6B", "#222222")
cls.FRAME = ("#D4D5D6", "#3F3F3F")
cls.FRAME_2 = ("#BFBEC1", "#505050")
cls.CHECKBOX_LINES = ("black", "#ededed")
cls.DARKEN_COLOR_FACTOR = 0.8 # used to generate color for disabled button
elif theme_name.lower() == "green":
cls.WINDOW_BG = ("#ECECEC", "#323232") # macOS standard light and dark window bg colors
cls.MAIN = ("#29B57E", "#29B57E")
cls.MAIN_HOVER = ("#6ACBA5", "#6ACBA5")
cls.ENTRY = ("#656565", "#222223")
cls.TEXT = ("black", "white")
cls.LABEL_BG = ("white", "#626061")
cls.SLIDER_BG = ("#636363", "#0D1321")
cls.SLIDER_PROGRESS = ("white", "#727578")
cls.PROGRESS_BG = ("#636363", "#0D1321")
cls.FRAME = ("#D4D5D6", "#3F3F3F")
cls.FRAME_2 = ("#BFBEC1", "#505050")
cls.CHECKBOX_LINES = ("#414141", "#EDEDED")
cls.DARKEN_COLOR_FACTOR = 0.8 # used to generate color for disabled button
elif theme_name.lower() == "dark-blue":
cls.WINDOW_BG = ("#F1F1F1", "#192026") # macOS standard light and dark window bg colors
cls.MAIN = ("#608BD5", "#395E9C")
cls.MAIN_HOVER = ("#A4BDE6", "#748BB3")
cls.ENTRY = ("#FCFCFC", "#111116")
cls.TEXT = ("black", "white")
cls.LABEL_BG = ("white", "#444444")
cls.SLIDER_BG = ("#444444", "#444444")
cls.SLIDER_PROGRESS = ("white", "#AAAAAA")
cls.PROGRESS_BG = ("#636363", "#0D1321")
cls.FRAME = ("#DADADA", "#2B2C2E")
cls.FRAME_2 = ("#C4C4C4", "#383838")
cls.CHECKBOX_LINES = ("#313131", "white")
cls.DARKEN_COLOR_FACTOR = 0.8 # used to generate color for disabled button
@staticmethod
def single_color(color, appearance_mode: int) -> str:
@ -48,17 +98,9 @@ class CTkColorManager:
return hex_color
@classmethod
def set_theme_color(cls, hex_color: str, hex_color_hover: str):
cls.MAIN = hex_color
cls.MAIN_HOVER = hex_color_hover
def set_main_color(cls, main_color, main_color_hover):
cls.MAIN = main_color
cls.MAIN_HOVER = main_color_hover
@classmethod
def set_theme(cls, main_color: str):
if main_color.lower() == "green":
cls.set_theme_color("#2EDEA4", "#82FCD4")
elif main_color.lower() == "blue":
cls.set_theme_color("#1C94CF", "#5FB4DD")
else:
sys.stderr.write("WARNING (CTkColorManager): No such color theme available: {}\n".format(main_color))
CTkColorManager.initialize_color_theme("blue")

View File

@ -12,8 +12,8 @@ class CTkDialog:
master=None,
title="CTkDialog",
text="CTkDialog",
fg_color=CTkColorManager.MAIN,
hover_color=CTkColorManager.MAIN_HOVER):
fg_color="CTkColorManager",
hover_color="CTkColorManager"):
self.master = master
self.user_input = None
@ -21,8 +21,8 @@ class CTkDialog:
self.height = len(text.split("\n"))*20 + 150
self.fg_color = CTkColorManager.MAIN if fg_color is None else fg_color
self.hover_color = CTkColorManager.MAIN_HOVER if hover_color is None else hover_color
self.fg_color = CTkColorManager.MAIN if fg_color == "CTkColorManager" else fg_color
self.hover_color = CTkColorManager.MAIN_HOVER if hover_color == "CTkColorManager" else hover_color
self.top = tkinter.Toplevel()
self.top.geometry(f"280x{self.height}")

View File

@ -11,8 +11,8 @@ class CTkEntry(tkinter.Frame):
def __init__(self,
master=None,
bg_color=None,
fg_color=CTkColorManager.ENTRY,
text_color=CTkColorManager.TEXT,
fg_color="CTkColorManager",
text_color="CTkColorManager",
corner_radius=8,
width=120,
height=30,
@ -45,8 +45,8 @@ class CTkEntry(tkinter.Frame):
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.fg_color = self.bg_color if fg_color is None else fg_color
self.text_color = text_color
self.fg_color = CTkColorManager.ENTRY if fg_color == "CTkColorManager" else fg_color
self.text_color = CTkColorManager.TEXT if text_color == "CTkColorManager" else text_color
self.width = width
self.height = height

View File

@ -9,7 +9,7 @@ from .customtkinter_color_manager import CTkColorManager
class CTkFrame(tkinter.Frame):
def __init__(self, *args,
bg_color=None,
fg_color=None,
fg_color="CTkColorManager",
corner_radius=10,
width=200,
height=200,
@ -42,7 +42,7 @@ class CTkFrame(tkinter.Frame):
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
if fg_color is None:
if fg_color == "CTkColorManager":
if isinstance(self.master, CTkFrame):
if self.master.fg_color == CTkColorManager.FRAME:
self.fg_color = CTkColorManager.FRAME_2

View File

@ -11,8 +11,8 @@ class CTkLabel(tkinter.Frame):
def __init__(self,
master=None,
bg_color=None,
fg_color=None,
text_color=CTkColorManager.TEXT,
fg_color="CTkColorManager",
text_color="CTkColorManager",
corner_radius=8,
width=120,
height=25,
@ -47,8 +47,8 @@ class CTkLabel(tkinter.Frame):
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.fg_color = self.bg_color if fg_color is None else fg_color
self.text_color = text_color
self.fg_color = CTkColorManager.LABEL_BG if fg_color == "CTkColorManager" else fg_color
self.text_color = CTkColorManager.TEXT if text_color == "CTkColorManager" else text_color
self.width = width
self.height = height
@ -153,21 +153,26 @@ class CTkLabel(tkinter.Frame):
else:
self.canvas.configure(bg=self.bg_color)
if self.fg_color is None:
new_fg_color = self.bg_color
else:
new_fg_color = self.fg_color
for part in self.fg_parts:
if type(self.fg_color) == tuple:
self.canvas.itemconfig(part, fill=self.fg_color[self.appearance_mode], width=0)
if type(new_fg_color) == tuple:
self.canvas.itemconfig(part, fill=new_fg_color[self.appearance_mode], width=0)
else:
self.canvas.itemconfig(part, fill=self.fg_color, width=0)
self.canvas.itemconfig(part, fill=new_fg_color, width=0)
if type(self.text_color) == tuple:
self.text_label.configure(fg=self.text_color[self.appearance_mode])
else:
self.text_label.configure(fg=self.text_color)
if type(self.fg_color) == tuple:
self.text_label.configure(bg=self.fg_color[self.appearance_mode])
if type(new_fg_color) == tuple:
self.text_label.configure(bg=new_fg_color[self.appearance_mode])
else:
self.text_label.configure(bg=self.fg_color)
self.text_label.configure(bg=new_fg_color)
def config(self, *args, **kwargs):
self.configure(*args, **kwargs)

View File

@ -12,9 +12,9 @@ class CTkProgressBar(tkinter.Frame):
def __init__(self,
bg_color=None,
border_color=CTkColorManager.PROGRESS_BG,
fg_color=CTkColorManager.PROGRESS_BG,
progress_color=CTkColorManager.MAIN,
border_color="CTkColorManager",
fg_color="CTkColorManager",
progress_color="CTkColorManager",
width=160,
height=10,
border_width=0,
@ -46,9 +46,9 @@ class CTkProgressBar(tkinter.Frame):
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.border_color = border_color
self.fg_color = fg_color
self.progress_color = CTkColorManager.MAIN if progress_color is None else progress_color
self.border_color = CTkColorManager.PROGRESS_BG if border_color == "CTkColorManager" else border_color
self.fg_color = CTkColorManager.PROGRESS_BG if fg_color == "CTkColorManager" else fg_color
self.progress_color = CTkColorManager.MAIN if progress_color == "CTkColorManager" else progress_color
self.width = width
self.height = self.calc_optimal_height(height)

View File

@ -13,10 +13,10 @@ class CTkSlider(tkinter.Frame):
def __init__(self,
bg_color=None,
border_color=None,
fg_color=CTkColorManager.SLIDER_BG,
progress_color=None,
button_color=CTkColorManager.MAIN,
button_hover_color=CTkColorManager.MAIN_HOVER,
fg_color="CTkColorManager",
progress_color="CTkColorManager",
button_color="CTkColorManager",
button_hover_color="CTkColorManager",
from_=0,
to=1,
number_of_steps=None,
@ -53,10 +53,10 @@ class CTkSlider(tkinter.Frame):
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
self.border_color = border_color
self.fg_color = fg_color
self.progress_color = progress_color
self.button_color = self.bg_color if button_color is None else button_color
self.button_hover_color = self.bg_color if button_hover_color is None else button_hover_color
self.fg_color = CTkColorManager.SLIDER_BG if fg_color == "CTkColorManager" else fg_color
self.progress_color = CTkColorManager.SLIDER_PROGRESS if progress_color == "CTkColorManager" else progress_color
self.button_color = CTkColorManager.MAIN if button_color == "CTkColorManager" else button_color
self.button_hover_color = CTkColorManager.MAIN if button_hover_color == "CTkColorManager" else button_hover_color
self.width = width
self.height = self.calc_optimal_height(height)

View File

@ -10,13 +10,14 @@ from .customtkinter_color_manager import CTkColorManager
class CTk(tkinter.Tk):
def __init__(self, *args,
fg_color=CTkColorManager.WINDOW_BG,
fg_color="CTkColorManager",
**kwargs):
self.enable_macos_dark_title_bar()
self.appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark"
self.fg_color = fg_color
self.fg_color = CTkColorManager.WINDOW_BG if fg_color == "CTkColorManager" else fg_color
if "bg" in kwargs:
self.fg_color = kwargs["bg"]
del kwargs["bg"]

View File

@ -4,6 +4,7 @@ import customtkinter
import sys
customtkinter.set_appearance_mode("System") # Other: "Light", "Dark"
customtkinter.set_default_color_theme("dark-blue") # Themes: "blue" (standard), "green", "dark-blue"
class App(customtkinter.CTk):
@ -114,13 +115,13 @@ class App(customtkinter.CTk):
width=160,
height=16,
border_width=5,
progress_color=("gray65", "gray40"),
command=self.progressbar.set)
self.slider_2.place(x=20, rely=0.7, anchor=tkinter.W)
self.slider_2.set(0.7)
self.label_info_2 = customtkinter.CTkLabel(master=self.frame_right,
text="CTkLabel: Lorem ipsum",
fg_color=None,
width=180,
height=20,
justify=tkinter.CENTER)

View File

@ -131,6 +131,7 @@ class App(customtkinter.CTk):
self.label_info_2 = customtkinter.CTkLabel(master=self.frame_right,
text="CTkLabel: Lorem ipsum",
fg_color=None,
width=180,
height=20,
justify=tkinter.CENTER)

View File

@ -5,6 +5,7 @@ from PIL import Image, ImageTk
import os
customtkinter.set_appearance_mode("Dark") # Other: "Light", "System"
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
PATH = os.path.dirname(os.path.realpath(__file__))

View File

@ -2,12 +2,13 @@ import time
import tkinter
import customtkinter # <- import the CustomTkinter module
customtkinter.set_appearance_mode("System") # Other: "Dark", "Light"
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
root_tk = customtkinter.CTk() # create CTk window like you do with the Tk window (you can also use normal tkinter.Tk window)
root_tk.geometry("400x300")
root_tk.title("CustomTkinter Test")
customtkinter.set_appearance_mode("System") # Other: "Dark", "Light"
def button_function():
print("Button click")
@ -34,9 +35,9 @@ button_1 = customtkinter.CTkButton(master=frame_1, corner_radius=10, command=but
button_1.place(relx=0.5, rely=0.4, anchor=tkinter.CENTER)
# button_1.configure(state="disabled")
slider_1 = customtkinter.CTkSlider(master=frame_1, command=slider_function, from_=0, to=1, progress_color="gray20")
slider_1 = customtkinter.CTkSlider(master=frame_1, command=slider_function, from_=0, to=1)
slider_1.place(relx=0.5, rely=0.55, anchor=tkinter.CENTER)
slider_1.set(1.5)
slider_1.set(0.5)
entry_1 = customtkinter.CTkEntry(master=frame_1)
entry_1.place(relx=0.5, rely=0.75, anchor=tkinter.CENTER)

View File

@ -6,6 +6,7 @@ import os
PATH = os.path.dirname(os.path.realpath(__file__))
customtkinter.set_appearance_mode("System") # Other: "Dark", "Light"
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
root_tk = customtkinter.CTk() # create CTk window like you do with the Tk window (you can also use normal tkinter.Tk window)
root_tk.geometry("400x400")