mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
fixed simple_example.py
This commit is contained in:
parent
8c0f1d2c43
commit
3eb0d411c5
@ -67,6 +67,15 @@ def set_default_color_theme(color_string):
|
|||||||
CTkThemeManager.load_theme(color_string)
|
CTkThemeManager.load_theme(color_string)
|
||||||
|
|
||||||
|
|
||||||
|
def deactivate_dpi_awareness(deactivate_awareness: bool):
|
||||||
|
CTkSettings.deactivate_automatic_dpi_awareness = deactivate_awareness
|
||||||
|
|
||||||
|
|
||||||
|
def set_user_scaling(scaling_value: float):
|
||||||
|
ScalingTracker.set_spacing_scaling(scaling_value)
|
||||||
|
ScalingTracker.set_widget_scaling(scaling_value)
|
||||||
|
|
||||||
|
|
||||||
# Load fonts:
|
# Load fonts:
|
||||||
if sys.platform.startswith("win"):
|
if sys.platform.startswith("win"):
|
||||||
from ctypes import windll, byref, create_unicode_buffer, create_string_buffer
|
from ctypes import windll, byref, create_unicode_buffer, create_string_buffer
|
||||||
@ -106,7 +115,7 @@ if sys.platform.startswith("win"):
|
|||||||
"Using 'circle_shapes' instead. The rendering quality will be very bad!")
|
"Using 'circle_shapes' instead. The rendering quality will be very bad!")
|
||||||
CTkSettings.preferred_drawing_method = "circle_shapes"
|
CTkSettings.preferred_drawing_method = "circle_shapes"
|
||||||
|
|
||||||
elif sys.platform == "linux":
|
elif sys.platform.startswith("linux"):
|
||||||
try:
|
try:
|
||||||
if not os.path.isdir(os.path.expanduser('~/.fonts/')):
|
if not os.path.isdir(os.path.expanduser('~/.fonts/')):
|
||||||
os.mkdir(os.path.expanduser('~/.fonts/'))
|
os.mkdir(os.path.expanduser('~/.fonts/'))
|
||||||
|
@ -4,15 +4,18 @@ import sys
|
|||||||
class CTkSettings:
|
class CTkSettings:
|
||||||
|
|
||||||
circle_font_is_ready = False
|
circle_font_is_ready = False
|
||||||
preferred_drawing_method = None
|
preferred_drawing_method: str = None # 'polygon_shapes', 'font_shapes', 'circle_shapes'
|
||||||
radius_to_char_fine = None
|
radius_to_char_fine: dict = None # set in self.init_font_character_mapping()
|
||||||
|
|
||||||
cursor_manipulation_enabled = True
|
cursor_manipulation_enabled = True
|
||||||
deactivate_macos_window_header_manipulation = False
|
deactivate_macos_window_header_manipulation = False
|
||||||
deactivate_windows_window_header_manipulation = False
|
deactivate_windows_window_header_manipulation = False
|
||||||
|
deactivate_automatic_dpi_awareness = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def init_font_character_mapping(cls):
|
def init_font_character_mapping(cls):
|
||||||
|
""" optimizations made for Windows 10, 11 only """
|
||||||
|
|
||||||
radius_to_char_warped = {19: 'B', 18: 'B', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'B', 12: 'B', 11: 'B', 10: 'B',
|
radius_to_char_warped = {19: 'B', 18: 'B', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'B', 12: 'B', 11: 'B', 10: 'B',
|
||||||
9: 'C', 8: 'D', 7: 'C', 6: 'E', 5: 'F', 4: 'G', 3: 'H', 2: 'H', 1: 'H', 0: 'A'}
|
9: 'C', 8: 'D', 7: 'C', 6: 'E', 5: 'F', 4: 'G', 3: 'H', 2: 'H', 1: 'H', 0: 'A'}
|
||||||
|
|
||||||
@ -30,7 +33,6 @@ class CTkSettings:
|
|||||||
else: # macOS and Linux
|
else: # macOS and Linux
|
||||||
cls.radius_to_char_fine = radius_to_char_fine_windows_10
|
cls.radius_to_char_fine = radius_to_char_fine_windows_10
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def init_drawing_method(cls):
|
def init_drawing_method(cls):
|
||||||
""" possible: 'polygon_shapes', 'font_shapes', 'circle_shapes' """
|
""" possible: 'polygon_shapes', 'font_shapes', 'circle_shapes' """
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import tkinter
|
import tkinter
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from .ctk_settings import CTkSettings
|
||||||
|
|
||||||
|
|
||||||
class ScalingTracker:
|
class ScalingTracker:
|
||||||
|
|
||||||
@ -58,9 +60,14 @@ class ScalingTracker:
|
|||||||
def update_scaling_callbacks(cls):
|
def update_scaling_callbacks(cls):
|
||||||
for window, callback_list in cls.window_widgets_dict.items():
|
for window, callback_list in cls.window_widgets_dict.items():
|
||||||
for callback in callback_list:
|
for callback in callback_list:
|
||||||
|
if not CTkSettings.deactivate_automatic_dpi_awareness:
|
||||||
callback(cls.window_dpi_scaling_dict[window] * cls.widget_scaling,
|
callback(cls.window_dpi_scaling_dict[window] * cls.widget_scaling,
|
||||||
cls.window_dpi_scaling_dict[window] * cls.spacing_scaling,
|
cls.window_dpi_scaling_dict[window] * cls.spacing_scaling,
|
||||||
cls.window_dpi_scaling_dict[window] * cls.window_scaling)
|
cls.window_dpi_scaling_dict[window] * cls.window_scaling)
|
||||||
|
else:
|
||||||
|
callback(cls.widget_scaling,
|
||||||
|
cls.spacing_scaling,
|
||||||
|
cls.window_scaling)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def add_widget(cls, widget_callback, widget):
|
def add_widget(cls, widget_callback, widget):
|
||||||
@ -88,6 +95,23 @@ class ScalingTracker:
|
|||||||
if window not in cls.window_dpi_scaling_dict:
|
if window not in cls.window_dpi_scaling_dict:
|
||||||
cls.window_dpi_scaling_dict[window] = cls.get_window_dpi_scaling(window)
|
cls.window_dpi_scaling_dict[window] = cls.get_window_dpi_scaling(window)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def activate_high_dpi_awareness(cls):
|
||||||
|
""" make process DPI aware, customtkinter elemets will get scaled automatically,
|
||||||
|
only gets activated when CTk object is created """
|
||||||
|
|
||||||
|
if not CTkSettings.deactivate_automatic_dpi_awareness:
|
||||||
|
if sys.platform == "darwin":
|
||||||
|
pass # high DPI scaling works automatically on macOS
|
||||||
|
|
||||||
|
elif sys.platform.startswith("win"):
|
||||||
|
from ctypes import windll
|
||||||
|
windll.shcore.SetProcessDpiAwareness(2)
|
||||||
|
# Microsoft Docs: https://docs.microsoft.com/en-us/windows/win32/api/shellscalingapi/ne-shellscalingapi-process_dpi_awareness
|
||||||
|
|
||||||
|
else:
|
||||||
|
pass # DPI awareness on Linux not implemented
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_window_dpi_scaling(cls, window):
|
def get_window_dpi_scaling(cls, window):
|
||||||
if sys.platform == "darwin":
|
if sys.platform == "darwin":
|
||||||
@ -105,7 +129,7 @@ class ScalingTracker:
|
|||||||
return (x_dpi.value + y_dpi.value) / (2 * DPI100pc)
|
return (x_dpi.value + y_dpi.value) / (2 * DPI100pc)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return 1
|
return 1 # DPI awareness on Linux not implemented
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_dpi_scaling(cls):
|
def check_dpi_scaling(cls):
|
||||||
@ -118,4 +142,3 @@ class ScalingTracker:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
cls.update_loop_running = False
|
cls.update_loop_running = False
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ class CTkButton(CTkBaseClass):
|
|||||||
self.draw() # initial draw
|
self.draw() # initial draw
|
||||||
|
|
||||||
def configure_basic_grid(self):
|
def configure_basic_grid(self):
|
||||||
# Configuration of a grid system (2x2) in which all parts of CTkButton are centered on one row and one column
|
# Configuration of a grid system (2x2) in which all parts of CTkButton are centered
|
||||||
self.grid_rowconfigure(0, weight=1)
|
self.grid_rowconfigure(0, weight=1)
|
||||||
self.grid_columnconfigure(0, weight=1)
|
self.grid_columnconfigure(0, weight=1)
|
||||||
self.grid_rowconfigure(1, weight=1)
|
self.grid_rowconfigure(1, weight=1)
|
||||||
@ -103,7 +103,6 @@ class CTkButton(CTkBaseClass):
|
|||||||
self.draw()
|
self.draw()
|
||||||
|
|
||||||
def draw(self, no_color_updates=False):
|
def draw(self, no_color_updates=False):
|
||||||
# print("current_height", self.current_height, "desired", self.desired_height)
|
|
||||||
requires_recoloring = self.draw_engine.draw_rounded_rect_with_border(self.apply_widget_scaling(self.current_width),
|
requires_recoloring = self.draw_engine.draw_rounded_rect_with_border(self.apply_widget_scaling(self.current_width),
|
||||||
self.apply_widget_scaling(self.current_height),
|
self.apply_widget_scaling(self.current_height),
|
||||||
self.apply_widget_scaling(self.corner_radius),
|
self.apply_widget_scaling(self.corner_radius),
|
||||||
|
@ -17,6 +17,7 @@ class CTk(tkinter.Tk):
|
|||||||
fg_color="default_theme",
|
fg_color="default_theme",
|
||||||
**kwargs):
|
**kwargs):
|
||||||
|
|
||||||
|
ScalingTracker.activate_high_dpi_awareness() # make process DPI aware
|
||||||
self.enable_macos_dark_title_bar()
|
self.enable_macos_dark_title_bar()
|
||||||
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import tkinter
|
import tkinter
|
||||||
import tkinter.messagebox
|
import tkinter.messagebox
|
||||||
import customtkinter
|
import customtkinter
|
||||||
import sys
|
|
||||||
|
|
||||||
customtkinter.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light"
|
customtkinter.set_appearance_mode("System") # Modes: "System" (standard), "Dark", "Light"
|
||||||
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
|
customtkinter.set_default_color_theme("blue") # Themes: "blue" (standard), "green", "dark-blue"
|
||||||
|
@ -14,10 +14,6 @@ def button_function():
|
|||||||
|
|
||||||
|
|
||||||
def slider_function(value):
|
def slider_function(value):
|
||||||
customtkinter.ScalingTracker.set_widget_scaling(value * 2)
|
|
||||||
customtkinter.ScalingTracker.set_spacing_scaling(value * 2)
|
|
||||||
customtkinter.ScalingTracker.set_window_scaling(value * 2)
|
|
||||||
|
|
||||||
progressbar_1.set(value)
|
progressbar_1.set(value)
|
||||||
|
|
||||||
|
|
||||||
|
67
test/test_scaling/simple_example.py
Normal file
67
test/test_scaling/simple_example.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
import tkinter
|
||||||
|
import customtkinter # <- import the CustomTkinter module
|
||||||
|
|
||||||
|
customtkinter.ScalingTracker.set_window_scaling(1.5)
|
||||||
|
customtkinter.ScalingTracker.set_spacing_scaling(1.5)
|
||||||
|
customtkinter.ScalingTracker.set_widget_scaling(1.5)
|
||||||
|
|
||||||
|
customtkinter.set_appearance_mode("dark") # Modes: "System" (standard), "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("400x480")
|
||||||
|
root_tk.title("CustomTkinter Test")
|
||||||
|
|
||||||
|
print(customtkinter.ScalingTracker.get_window_scaling(root_tk))
|
||||||
|
|
||||||
|
def button_function():
|
||||||
|
print("Button click", label_1.text_label.cget("text"))
|
||||||
|
|
||||||
|
|
||||||
|
def slider_function(value):
|
||||||
|
progressbar_1.set(value)
|
||||||
|
|
||||||
|
|
||||||
|
def check_box_function():
|
||||||
|
print("checkbox_1:", checkbox_1.get())
|
||||||
|
|
||||||
|
|
||||||
|
y_padding = 13
|
||||||
|
|
||||||
|
frame_1 = customtkinter.CTkFrame(master=root_tk, corner_radius=15)
|
||||||
|
frame_1.pack(pady=20, padx=60, fill="both", expand=True)
|
||||||
|
|
||||||
|
label_1 = customtkinter.CTkLabel(master=frame_1, justify=tkinter.LEFT)
|
||||||
|
label_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
progressbar_1 = customtkinter.CTkProgressBar(master=frame_1)
|
||||||
|
progressbar_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
button_1 = customtkinter.CTkButton(master=frame_1, corner_radius=8, command=button_function)
|
||||||
|
button_1.pack(pady=y_padding, padx=10)
|
||||||
|
# button_1.configure(state="disabled")
|
||||||
|
|
||||||
|
slider_1 = customtkinter.CTkSlider(master=frame_1, command=slider_function, from_=0, to=1)
|
||||||
|
slider_1.pack(pady=y_padding, padx=10)
|
||||||
|
slider_1.set(0.5)
|
||||||
|
|
||||||
|
entry_1 = customtkinter.CTkEntry(master=frame_1, placeholder_text="CTkEntry")
|
||||||
|
entry_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
checkbox_1 = customtkinter.CTkCheckBox(master=frame_1, command=check_box_function)
|
||||||
|
checkbox_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
radiobutton_var = tkinter.IntVar(value=1)
|
||||||
|
|
||||||
|
radiobutton_1 = customtkinter.CTkRadioButton(master=frame_1, variable=radiobutton_var, value=1)
|
||||||
|
radiobutton_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
radiobutton_2 = customtkinter.CTkRadioButton(master=frame_1, variable=radiobutton_var, value=2)
|
||||||
|
radiobutton_2.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
s_var = tkinter.StringVar(value="on")
|
||||||
|
|
||||||
|
switch_1 = customtkinter.CTkSwitch(master=frame_1)
|
||||||
|
switch_1.pack(pady=y_padding, padx=10)
|
||||||
|
|
||||||
|
root_tk.mainloop()
|
Loading…
x
Reference in New Issue
Block a user