From cdd20f9817b4f2265b9e23128aec3f73bb541cc6 Mon Sep 17 00:00:00 2001 From: Joel Otten Date: Thu, 25 Jul 2024 07:30:52 -0700 Subject: [PATCH] better dropdown image, alias added to each widget --- .../fonts/CustomTkinter_shapes_font_FV.otf | Bin 0 -> 3428 bytes customtkinter/assets/fonts/test4.otf | Bin 0 -> 3432 bytes customtkinter/windows/ctk_tk.py | 2 +- customtkinter/windows/ctk_toplevel.py | 2 +- .../windows/widgets/core_rendering/ctk_canvas.py | 1 - .../widgets/core_rendering/draw_engine.py | 1 - customtkinter/windows/widgets/ctk_button.py | 12 +++++++++++- customtkinter/windows/widgets/ctk_checkbox.py | 8 ++++++++ customtkinter/windows/widgets/ctk_combobox.py | 9 +++++++++ customtkinter/windows/widgets/ctk_entry.py | 8 ++++++++ customtkinter/windows/widgets/ctk_frame.py | 8 ++++++++ customtkinter/windows/widgets/ctk_label.py | 8 ++++++++ customtkinter/windows/widgets/ctk_optionmenu.py | 10 +++++++++- customtkinter/windows/widgets/ctk_progressbar.py | 8 ++++++++ customtkinter/windows/widgets/ctk_radiobutton.py | 8 ++++++++ .../windows/widgets/ctk_scrollable_frame.py | 10 +++++++++- customtkinter/windows/widgets/ctk_scrollbar.py | 8 ++++++++ .../windows/widgets/ctk_segmented_button.py | 10 +++++++++- customtkinter/windows/widgets/ctk_slider.py | 9 +++++++++ customtkinter/windows/widgets/ctk_switch.py | 8 ++++++++ customtkinter/windows/widgets/ctk_tabview.py | 8 ++++++++ customtkinter/windows/widgets/ctk_textbox.py | 8 ++++++++ customtkinter/windows/widgets/font/__init__.py | 2 +- 23 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 customtkinter/assets/fonts/CustomTkinter_shapes_font_FV.otf create mode 100644 customtkinter/assets/fonts/test4.otf diff --git a/customtkinter/assets/fonts/CustomTkinter_shapes_font_FV.otf b/customtkinter/assets/fonts/CustomTkinter_shapes_font_FV.otf new file mode 100644 index 0000000000000000000000000000000000000000..a7b4e4792d861d4e0836f49d4d920fc6321ca9aa GIT binary patch literal 3428 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 literal 0 HcmV?d00001 diff --git a/customtkinter/assets/fonts/test4.otf b/customtkinter/assets/fonts/test4.otf new file mode 100644 index 0000000000000000000000000000000000000000..450c5499be170e65a1ec648234b569e373397adb GIT binary patch literal 3432 zcmdUydvp|c702)FY#t<=AylT4u+45M0#Y6!V381%N=e`VCWR!B@JN=t$vfEq+Mp0Z z30cCk5J<_RKnkU3#Uj#zRBLTHEj^`z)mlqWMFsx=dn)jqwl7SDXJuy9z zz9vMjvl0zTo;NnG=tk}ZBE>6uc223UA|+&cxs+Wkw#>pjU+&O{Lgz`^NePb?iXr$X zszdmigrS9{{*@U8LFb4foTBHJ`c_s@REnT7NTT2}UuoWfmpz|}zM4oiE6S_=(oQSs zPZD`akyyeT5tFZG^-s7?;i}b6y721q!`A!HbCcuD?wjXTI4u96WO=q8DdRYK^E{C= z#_Tq4sOYV!FRd?*B9eAUOscwFxkf=!qS0|e^o@OQsxW|#04n%%4}4RbA+-$g9rEFE5j%xsta) zYAlg*Rifq<)Rg!HyfWYS@5y_2ect$c`u5)T^*`|QCA_5fj#0IYmo+M0ils3UVrd*v zdR|p^QF)m+c1&!nsQ2HVyGHSzt-0OhzN!53@%=aHznOHh_DEm2wUc{yhuGY57JO6Q zVZA4pwVS+@MwzB5WbxyaVX^tC`784jDZN%ZQiAP+=HHEX@f`*3O6ye}sxv4!B(z^x zxGO^IA35NGuME^5l$5Vphx7l%(|cFkyQOm2%4w@85C6x-BPYE=K99d!Hwa$3bS>Mu)v<{b;(dryzIw&*=G zSlv-*h};50S&c{uGPL;Hq z-lWf!XeCMUEA7e|rOPqQk?vUQc**gR8mdlEed;Flq_f!B($mo1HA4Slgz;$Ch!F1S z>C%n2@ovxCAzDwjW;ArA=zNgXhkuWp$)CP48`2$(cY5=Ow_rBi$q$u1S#i<&O11l^Y|IwfjrK|GuR=W z$iYsC9l5;2qZy@!s=ta?bl%2GIfu9MHstV9Y{fP#g%8`YjeS_k+dbNLZopQ(tJWB% z^JdN#+02{a<7{lgW@IA^Td+9u4vULEI+NS!zG5|NGEgeANf8%362v9zyA zw8h-y(Kg`Q_^FPM!8$kcLSDohxDktZAvT~93z3Nc#EymB=+WxCYH(KPzvTyghA(tp z&l#M_PxE?Yat5BpdSqY$8nB)hAcGq`+7CrNsN)T*@_L>xQqT2R!1J*d^_Y)ztV2Dg zV?M9*Xy4z0ZMw16aOu2;(?r&A9nv@zYedqJiaOMZmdbS=t-?4h<1tIdk83%FpX8^w z7Ef{toAH~hLm#)CR9=h-65c?D+kEG!q9jagWM6{5}J6&`KT zC48V8qi{&)N>1V#vN$U-gOgAp%Qp#$)-o0?i7P$YH1Q)t_bz^>%j_kH)73BF3hO%?Rh0oiP-rUZIJSo}iwf v(dseLkBEL)^aJ#`x|b5wU6i73qD-}(a@As5rOu_Ds+Ufym(6bV8jbxIy!K_M literal 0 HcmV?d00001 diff --git a/customtkinter/windows/ctk_tk.py b/customtkinter/windows/ctk_tk.py index e137dc3c..47b9a689 100644 --- a/customtkinter/windows/ctk_tk.py +++ b/customtkinter/windows/ctk_tk.py @@ -10,7 +10,7 @@ from .widgets.scaling import CTkScalingBaseClass from .widgets.appearance_mode import CTkAppearanceModeBaseClass -from customtkinter.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty +from customtkinter_FV_Automation.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty CTK_PARENT_CLASS = tkinter.Tk diff --git a/customtkinter/windows/ctk_toplevel.py b/customtkinter/windows/ctk_toplevel.py index 9780380b..78bcc3ce 100644 --- a/customtkinter/windows/ctk_toplevel.py +++ b/customtkinter/windows/ctk_toplevel.py @@ -10,7 +10,7 @@ from .widgets.scaling import CTkScalingBaseClass from .widgets.appearance_mode import CTkAppearanceModeBaseClass -from customtkinter.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty +from customtkinter_FV_Automation.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseClass): diff --git a/customtkinter/windows/widgets/core_rendering/ctk_canvas.py b/customtkinter/windows/widgets/core_rendering/ctk_canvas.py index f291e2cb..2953198f 100644 --- a/customtkinter/windows/widgets/core_rendering/ctk_canvas.py +++ b/customtkinter/windows/widgets/core_rendering/ctk_canvas.py @@ -81,7 +81,6 @@ def create_aa_circle(self, x_pos: int, y_pos: int, radius: int, angle: int = 0, return circle_1 def coords(self, tag_or_id, *args): - if type(tag_or_id) == str and "ctk_aa_circle_font_element" in self.gettags(tag_or_id): coords_id = self.find_withtag(tag_or_id)[0] # take the lowest id for the given tag super().coords(coords_id, *args[:2]) diff --git a/customtkinter/windows/widgets/core_rendering/draw_engine.py b/customtkinter/windows/widgets/core_rendering/draw_engine.py index 5acea560..247730fc 100644 --- a/customtkinter/windows/widgets/core_rendering/draw_engine.py +++ b/customtkinter/windows/widgets/core_rendering/draw_engine.py @@ -1228,7 +1228,6 @@ def draw_dropdown_arrow(self, x_position: Union[int, float], y_position: Union[i self._canvas.create_text(0, 0, text="Y", font=("CustomTkinter_shapes_font", -size), tags="dropdown_arrow", anchor=tkinter.CENTER) self._canvas.tag_raise("dropdown_arrow") requires_recoloring = True - self._canvas.itemconfigure("dropdown_arrow", font=("CustomTkinter_shapes_font", -size)) self._canvas.coords("dropdown_arrow", x_position, y_position) diff --git a/customtkinter/windows/widgets/ctk_button.py b/customtkinter/windows/widgets/ctk_button.py index e9f78391..f93b2bf5 100644 --- a/customtkinter/windows/widgets/ctk_button.py +++ b/customtkinter/windows/widgets/ctk_button.py @@ -46,11 +46,14 @@ def __init__(self, command: Union[Callable[[], Any], None] = None, compound: str = "left", anchor: str = "center", + alias: str = "NA", **kwargs): # transfer basic functionality (bg_color, size, appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # shape self._corner_radius: int = ThemeManager.theme["CTkButton"]["corner_radius"] if corner_radius is None else corner_radius self._corner_radius = min(self._corner_radius, round(self._current_height / 2)) @@ -184,6 +187,7 @@ def _draw(self, no_color_updates=False): super()._draw(no_color_updates) if self._background_corner_colors is not None: + self._draw_engine.draw_background_corners(self._apply_widget_scaling(self._current_width), self._apply_widget_scaling(self._current_height)) self._canvas.itemconfig("background_corner_top_left", fill=self._apply_appearance_mode(self._background_corner_colors[0])) @@ -192,7 +196,7 @@ def _draw(self, no_color_updates=False): self._canvas.itemconfig("background_corner_bottom_left", fill=self._apply_appearance_mode(self._background_corner_colors[3])) else: self._canvas.delete("background_parts") - + 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._corner_radius), @@ -439,6 +443,9 @@ def configure(self, require_redraw=False, **kwargs): self._create_grid() require_redraw = True + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -480,6 +487,9 @@ def cget(self, attribute_name: str) -> any: return self._compound elif attribute_name == "anchor": return self._anchor + elif attribute_name == "alias": + return self.alias + else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_checkbox.py b/customtkinter/windows/widgets/ctk_checkbox.py index 42f04f5e..acc0fb4b 100644 --- a/customtkinter/windows/widgets/ctk_checkbox.py +++ b/customtkinter/windows/widgets/ctk_checkbox.py @@ -41,11 +41,14 @@ def __init__(self, onvalue: Union[int, str] = 1, offvalue: Union[int, str] = 0, variable: Union[tkinter.Variable, None] = None, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # dimensions self._checkbox_width = checkbox_width self._checkbox_height = checkbox_height @@ -291,6 +294,9 @@ def configure(self, require_redraw=False, **kwargs): self._textvariable = kwargs.pop("textvariable") self._text_label.configure(textvariable=self._textvariable) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + if "variable" in kwargs: if self._variable is not None and self._variable != "": self._variable.trace_remove("write", self._variable_callback_name) # remove old variable callback @@ -343,6 +349,8 @@ def cget(self, attribute_name: str) -> any: return self._offvalue elif attribute_name == "variable": return self._variable + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_combobox.py b/customtkinter/windows/widgets/ctk_combobox.py index 99495641..37144913 100644 --- a/customtkinter/windows/widgets/ctk_combobox.py +++ b/customtkinter/windows/widgets/ctk_combobox.py @@ -43,11 +43,14 @@ def __init__(self, variable: Union[tkinter.Variable, None] = None, command: Union[Callable[[str], Any], None] = None, justify: str = "left", + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # shape self._corner_radius = ThemeManager.theme["CTkComboBox"]["corner_radius"] if corner_radius is None else corner_radius self._border_width = ThemeManager.theme["CTkComboBox"]["border_width"] if border_width is None else border_width @@ -295,6 +298,10 @@ def configure(self, require_redraw=False, **kwargs): if "justify" in kwargs: self._entry.configure(justify=kwargs.pop("justify")) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -338,6 +345,8 @@ def cget(self, attribute_name: str) -> any: return self._command elif attribute_name == "justify": return self._entry.cget("justify") + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_entry.py b/customtkinter/windows/widgets/ctk_entry.py index cdc0220b..57547ae3 100644 --- a/customtkinter/windows/widgets/ctk_entry.py +++ b/customtkinter/windows/widgets/ctk_entry.py @@ -39,11 +39,14 @@ def __init__(self, placeholder_text: Union[str, None] = None, font: Optional[Union[tuple, CTkFont]] = None, state: str = tkinter.NORMAL, + alias: str = "NA", **kwargs): # transfer basic functionality (bg_color, size, appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height) + self.alias = alias + # configure grid system (1x1) self.grid_rowconfigure(0, weight=1) self.grid_columnconfigure(0, weight=1) @@ -249,6 +252,9 @@ def configure(self, require_redraw=False, **kwargs): else: self._entry.configure(show=kwargs.pop("show")) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + self._entry.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_entry_attributes)) # configure Tkinter.Entry super().configure(require_redraw=require_redraw, **kwargs) # configure CTkBaseClass @@ -275,6 +281,8 @@ def cget(self, attribute_name: str) -> any: return self._font elif attribute_name == "state": return self._state + elif attribute_name == "alias": + return self.alias elif attribute_name in self._valid_tk_entry_attributes: return self._entry.cget(attribute_name) # cget of tkinter.Entry diff --git a/customtkinter/windows/widgets/ctk_frame.py b/customtkinter/windows/widgets/ctk_frame.py index 7bddf3c2..c9baa8fc 100644 --- a/customtkinter/windows/widgets/ctk_frame.py +++ b/customtkinter/windows/widgets/ctk_frame.py @@ -27,11 +27,14 @@ def __init__(self, background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, overwrite_preferred_drawing_method: Union[str, None] = None, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color self._border_color = ThemeManager.theme["CTkFrame"]["border_color"] if border_color is None else self._check_color_type(border_color) @@ -163,6 +166,9 @@ def configure(self, require_redraw=False, **kwargs): if "border_width" in kwargs: self._border_width = kwargs.pop("border_width") require_redraw = True + + if "alias" in kwargs: + self.alias = kwargs.pop("alias") super().configure(require_redraw=require_redraw, **kwargs) @@ -178,6 +184,8 @@ def cget(self, attribute_name: str) -> any: return self._border_color elif attribute_name == "background_corner_colors": return self._background_corner_colors + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_label.py b/customtkinter/windows/widgets/ctk_label.py index 7e59ad76..bdc2cfab 100644 --- a/customtkinter/windows/widgets/ctk_label.py +++ b/customtkinter/windows/widgets/ctk_label.py @@ -39,11 +39,14 @@ def __init__(self, compound: str = "center", anchor: str = "center", # label anchor: center, n, e, s, w wraplength: int = 0, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height) + self.alias = alias + # color self._fg_color = ThemeManager.theme["CTkLabel"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) self._text_color = ThemeManager.theme["CTkLabel"]["text_color"] if text_color is None else self._check_color_type(text_color) @@ -234,6 +237,9 @@ def configure(self, require_redraw=False, **kwargs): self._wraplength = kwargs.pop("wraplength") self._label.configure(wraplength=self._apply_widget_scaling(self._wraplength)) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + self._label.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_label_attributes)) # configure tkinter.Label super().configure(require_redraw=require_redraw, **kwargs) # configure CTkBaseClass @@ -260,6 +266,8 @@ def cget(self, attribute_name: str) -> any: return self._anchor elif attribute_name == "wraplength": return self._wraplength + elif attribute_name == "alias": + return self.alias elif attribute_name in self._valid_tk_label_attributes: return self._label.cget(attribute_name) # cget of tkinter.Label diff --git a/customtkinter/windows/widgets/ctk_optionmenu.py b/customtkinter/windows/widgets/ctk_optionmenu.py index 491027b1..6f9f880a 100644 --- a/customtkinter/windows/widgets/ctk_optionmenu.py +++ b/customtkinter/windows/widgets/ctk_optionmenu.py @@ -42,11 +42,14 @@ def __init__(self, command: Union[Callable[[str], Any], None] = None, dynamic_resizing: bool = True, anchor: str = "w", + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color variables self._fg_color = ThemeManager.theme["CTkOptionMenu"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) self._button_color = ThemeManager.theme["CTkOptionMenu"]["button_color"] if button_color is None else self._check_color_type(button_color) @@ -305,6 +308,9 @@ def configure(self, require_redraw=False, **kwargs): if "anchor" in kwargs: self._text_label.configure(anchor=kwargs.pop("anchor")) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -346,7 +352,9 @@ def cget(self, attribute_name: str) -> any: return self._dynamic_resizing elif attribute_name == "anchor": return self._text_label.cget("anchor") - + elif attribute_name == "alias": + return self.alias + else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_progressbar.py b/customtkinter/windows/widgets/ctk_progressbar.py index 2d6ce59b..3e24b6b2 100644 --- a/customtkinter/windows/widgets/ctk_progressbar.py +++ b/customtkinter/windows/widgets/ctk_progressbar.py @@ -36,6 +36,7 @@ def __init__(self, mode: Literal["determinate", "indeterminate"] = "determinate", determinate_speed: float = 1, indeterminate_speed: float = 1, + alias: str = "NA", **kwargs): # set default dimensions according to orientation @@ -53,6 +54,8 @@ def __init__(self, # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color self._border_color = ThemeManager.theme["CTkProgressBar"]["border_color"] if border_color is None else self._check_color_type(border_color) self._fg_color = ThemeManager.theme["CTkProgressBar"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) @@ -200,6 +203,9 @@ def configure(self, require_redraw=False, **kwargs): if "indeterminate_speed" in kwargs: self._indeterminate_speed = kwargs.pop("indeterminate_speed") + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -225,6 +231,8 @@ def cget(self, attribute_name: str) -> any: return self._determinate_speed elif attribute_name == "indeterminate_speed": return self._indeterminate_speed + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_radiobutton.py b/customtkinter/windows/widgets/ctk_radiobutton.py index c07cd1f0..cd78db9f 100644 --- a/customtkinter/windows/widgets/ctk_radiobutton.py +++ b/customtkinter/windows/widgets/ctk_radiobutton.py @@ -40,11 +40,14 @@ def __init__(self, state: str = tkinter.NORMAL, hover: bool = True, command: Union[Callable, Any] = None, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # dimensions self._radiobutton_width = radiobutton_width self._radiobutton_height = radiobutton_height @@ -276,6 +279,9 @@ def configure(self, require_redraw=False, **kwargs): self._textvariable = kwargs.pop("textvariable") self._text_label.configure(textvariable=self._textvariable) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + if "variable" in kwargs: if self._variable is not None: self._variable.trace_remove("write", self._variable_callback_name) @@ -328,6 +334,8 @@ def cget(self, attribute_name: str) -> any: return self._hover elif attribute_name == "command": return self._command + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_scrollable_frame.py b/customtkinter/windows/widgets/ctk_scrollable_frame.py index eede0911..e6deb82b 100644 --- a/customtkinter/windows/widgets/ctk_scrollable_frame.py +++ b/customtkinter/windows/widgets/ctk_scrollable_frame.py @@ -36,10 +36,13 @@ def __init__(self, label_text: str = "", label_font: Optional[Union[tuple, CTkFont]] = None, label_anchor: str = "center", - orientation: Literal["vertical", "horizontal"] = "vertical"): + orientation: Literal["vertical", "horizontal"] = "vertical", + alias: str = "NA"): self._orientation = orientation + self.alias = alias + # dimensions independent of scaling self._desired_width = width # _desired_width and _desired_height, represent desired size set by width and height self._desired_height = height @@ -203,6 +206,9 @@ def configure(self, **kwargs): if "label_anchor" in kwargs: self._label.configure(anchor=kwargs.pop("label_anchor")) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + self._parent_frame.configure(**kwargs) def cget(self, attribute_name: str): @@ -228,6 +234,8 @@ def cget(self, attribute_name: str): return self._scrollbar.cget("button_color") elif attribute_name.startswith("scrollbar_button_hover_color"): return self._scrollbar.cget("button_hover_color") + elif attribute_name == "alias": + return self.alias else: return self._parent_frame.cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_scrollbar.py b/customtkinter/windows/widgets/ctk_scrollbar.py index 8e962215..4d7cdb8d 100644 --- a/customtkinter/windows/widgets/ctk_scrollbar.py +++ b/customtkinter/windows/widgets/ctk_scrollbar.py @@ -30,6 +30,7 @@ def __init__(self, hover: bool = True, command: Union[Callable, Any] = None, orientation: str = "vertical", + alias: str = "NA", **kwargs): # set default dimensions according to orientation @@ -47,6 +48,8 @@ def __init__(self, # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color self._fg_color = ThemeManager.theme["CTkScrollbar"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) self._button_color = ThemeManager.theme["CTkScrollbar"]["button_color"] if button_color is None else self._check_color_type(button_color) @@ -187,6 +190,9 @@ def configure(self, require_redraw=False, **kwargs): self._border_spacing = kwargs.pop("border_spacing") require_redraw = True + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -210,6 +216,8 @@ def cget(self, attribute_name: str) -> any: return self._command elif attribute_name == "orientation": return self._orientation + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_segmented_button.py b/customtkinter/windows/widgets/ctk_segmented_button.py index b8de1e79..84f011ae 100644 --- a/customtkinter/windows/widgets/ctk_segmented_button.py +++ b/customtkinter/windows/widgets/ctk_segmented_button.py @@ -41,10 +41,13 @@ def __init__(self, variable: Union[tkinter.Variable, None] = None, dynamic_resizing: bool = True, command: Union[Callable[[str], Any], None] = None, - state: str = "normal"): + state: str = "normal", + alias: str = "NA"): super().__init__(master=master, bg_color=bg_color, width=width, height=height) + self.alias = alias + self._sb_fg_color = ThemeManager.theme["CTkSegmentedButton"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) self._sb_selected_color = ThemeManager.theme["CTkSegmentedButton"]["selected_color"] if selected_color is None else self._check_color_type(selected_color) @@ -313,6 +316,9 @@ def configure(self, **kwargs): for button in self._buttons_dict.values(): button.configure(state=self._state) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + check_kwargs_empty(kwargs, raise_error=True) def cget(self, attribute_name: str) -> any: @@ -352,6 +358,8 @@ def cget(self, attribute_name: str) -> any: return self._dynamic_resizing elif attribute_name == "command": return self._command + elif attribute_name == "alias": + return self.alias else: raise ValueError(f"'{attribute_name}' is not a supported argument. Look at the documentation for supported arguments.") diff --git a/customtkinter/windows/widgets/ctk_slider.py b/customtkinter/windows/widgets/ctk_slider.py index 7aa03eeb..52a7040b 100644 --- a/customtkinter/windows/widgets/ctk_slider.py +++ b/customtkinter/windows/widgets/ctk_slider.py @@ -38,6 +38,7 @@ def __init__(self, command: Union[Callable[[float], Any], None] = None, variable: Union[tkinter.Variable, None] = None, orientation: str = "horizontal", + alias: str = "NA", **kwargs): # set default dimensions according to orientation @@ -55,6 +56,8 @@ def __init__(self, # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color self._border_color = self._check_color_type(border_color, transparency=True) self._fg_color = ThemeManager.theme["CTkSlider"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) @@ -271,6 +274,10 @@ def configure(self, require_redraw=False, **kwargs): self._orientation = kwargs.pop("orientation") require_redraw = True + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: @@ -310,6 +317,8 @@ def cget(self, attribute_name: str) -> any: return self._variable elif attribute_name == "orientation": return self._orientation + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_switch.py b/customtkinter/windows/widgets/ctk_switch.py index 155c1746..eb48955a 100644 --- a/customtkinter/windows/widgets/ctk_switch.py +++ b/customtkinter/windows/widgets/ctk_switch.py @@ -43,11 +43,14 @@ def __init__(self, hover: bool = True, command: Union[Callable, Any] = None, state: str = tkinter.NORMAL, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # dimensions self._switch_width = switch_width self._switch_height = switch_height @@ -333,6 +336,9 @@ def configure(self, require_redraw=False, **kwargs): self._textvariable = kwargs.pop("textvariable") self._text_label.configure(textvariable=self._textvariable) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + if "variable" in kwargs: if self._variable is not None and self._variable != "": self._variable.trace_remove("write", self._variable_callback_name) @@ -391,6 +397,8 @@ def cget(self, attribute_name: str) -> any: return self._command elif attribute_name == "state": return self._state + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_tabview.py b/customtkinter/windows/widgets/ctk_tabview.py index 3b2ea5bb..b29489b3 100644 --- a/customtkinter/windows/widgets/ctk_tabview.py +++ b/customtkinter/windows/widgets/ctk_tabview.py @@ -43,11 +43,14 @@ def __init__(self, command: Union[Callable, Any] = None, anchor: str = "center", state: str = "normal", + alias: str = "NA", **kwargs): # transfer some functionality to CTkFrame super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + self.alias = alias + # color self._border_color = ThemeManager.theme["CTkFrame"]["border_color"] if border_color is None else self._check_color_type(border_color) @@ -287,6 +290,9 @@ def configure(self, require_redraw=False, **kwargs): if "state" in kwargs: self._segmented_button.configure(state=kwargs.pop("state")) + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str): @@ -320,6 +326,8 @@ def cget(self, attribute_name: str): return self._anchor elif attribute_name == "state": return self._segmented_button.cget(attribute_name) + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/ctk_textbox.py b/customtkinter/windows/widgets/ctk_textbox.py index 4b3a165f..868c3b50 100644 --- a/customtkinter/windows/widgets/ctk_textbox.py +++ b/customtkinter/windows/widgets/ctk_textbox.py @@ -48,11 +48,14 @@ def __init__(self, font: Optional[Union[tuple, CTkFont]] = None, activate_scrollbars: bool = True, + alias: str = "NA", **kwargs): # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass super().__init__(master=master, bg_color=bg_color, width=width, height=height) + self.alias = alias + # color self._fg_color = ThemeManager.theme["CTkTextbox"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) self._border_color = ThemeManager.theme["CTkTextbox"]["border_color"] if border_color is None else self._check_color_type(border_color) @@ -302,6 +305,9 @@ def configure(self, require_redraw=False, **kwargs): self._update_font() + if "alias" in kwargs: + self.alias = kwargs.pop("alias") + self._textbox.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_text_attributes)) super().configure(require_redraw=require_redraw, **kwargs) @@ -322,6 +328,8 @@ def cget(self, attribute_name: str) -> any: elif attribute_name == "font": return self._font + elif attribute_name == "alias": + return self.alias else: return super().cget(attribute_name) diff --git a/customtkinter/windows/widgets/font/__init__.py b/customtkinter/windows/widgets/font/__init__.py index 64a49f16..22128334 100644 --- a/customtkinter/windows/widgets/font/__init__.py +++ b/customtkinter/windows/widgets/font/__init__.py @@ -15,7 +15,7 @@ FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "Roboto", "Roboto-Medium.ttf")) # load font necessary for rendering the widgets (used on Windows/Linux) -if FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "CustomTkinter_shapes_font.otf")) is False: +if FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "CustomTkinter_shapes_font_FV.otf")) is False: # change draw method if font loading failed if DrawEngine.preferred_drawing_method == "font_shapes": sys.stderr.write("customtkinter.windows.widgets.font warning: " +