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 00000000..a7b4e479 Binary files /dev/null and b/customtkinter/assets/fonts/CustomTkinter_shapes_font_FV.otf differ diff --git a/customtkinter/assets/fonts/test4.otf b/customtkinter/assets/fonts/test4.otf new file mode 100644 index 00000000..450c5499 Binary files /dev/null and b/customtkinter/assets/fonts/test4.otf differ 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: " +