diff --git a/customtkinter/widgets/ctk_button.py b/customtkinter/widgets/ctk_button.py index b114993..d1dfd24 100644 --- a/customtkinter/widgets/ctk_button.py +++ b/customtkinter/widgets/ctk_button.py @@ -238,6 +238,9 @@ class CTkButton(CTkBaseClass): padx=max(self._apply_widget_scaling(self._corner_radius), self._apply_widget_scaling(self._border_width)), pady=(self._apply_widget_scaling(self._border_width), 2)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "text" in kwargs: self._text = kwargs.pop("text") diff --git a/customtkinter/widgets/ctk_checkbox.py b/customtkinter/widgets/ctk_checkbox.py index 81eac6c..b942771 100644 --- a/customtkinter/widgets/ctk_checkbox.py +++ b/customtkinter/widgets/ctk_checkbox.py @@ -175,6 +175,9 @@ class CTkCheckBox(CTkBaseClass): self._text_label.configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "text" in kwargs: self._text = kwargs.pop("text") diff --git a/customtkinter/widgets/ctk_combobox.py b/customtkinter/widgets/ctk_combobox.py index ac47e8b..47d23d2 100644 --- a/customtkinter/widgets/ctk_combobox.py +++ b/customtkinter/widgets/ctk_combobox.py @@ -185,6 +185,9 @@ class CTkComboBox(CTkBaseClass): self._dropdown_menu.open(self.winfo_rootx(), self.winfo_rooty() + self._apply_widget_scaling(self._current_height + 0)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "state" in kwargs: self._state = kwargs.pop("state") diff --git a/customtkinter/widgets/ctk_entry.py b/customtkinter/widgets/ctk_entry.py index 2eb40e4..94422f5 100644 --- a/customtkinter/widgets/ctk_entry.py +++ b/customtkinter/widgets/ctk_entry.py @@ -140,8 +140,8 @@ class CTkEntry(CTkBaseClass): if self._placeholder_text_active: self._entry.config(fg=ThemeManager.single_color(self._placeholder_text_color, self._appearance_mode)) - def bind(self, *args, **kwargs): - self._entry.bind(*args, **kwargs) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "state" in kwargs: @@ -210,6 +210,9 @@ class CTkEntry(CTkBaseClass): self._entry.configure(**kwargs) # pass remaining kwargs to entry + def bind(self, *args, **kwargs): + self._entry.bind(*args, **kwargs) + def _activate_placeholder(self): if self._entry.get() == "" and self._placeholder_text is not None and (self._textvariable is None or self._textvariable == ""): self._placeholder_text_active = True diff --git a/customtkinter/widgets/ctk_frame.py b/customtkinter/widgets/ctk_frame.py index cffd6b4..ea0c6fa 100644 --- a/customtkinter/widgets/ctk_frame.py +++ b/customtkinter/widgets/ctk_frame.py @@ -112,6 +112,9 @@ class CTkFrame(CTkBaseClass): self._canvas.tag_lower("inner_parts") self._canvas.tag_lower("border_parts") + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "fg_color" in kwargs: self._fg_color = kwargs.pop("fg_color") diff --git a/customtkinter/widgets/ctk_label.py b/customtkinter/widgets/ctk_label.py index 76a7475..9043921 100644 --- a/customtkinter/widgets/ctk_label.py +++ b/customtkinter/widgets/ctk_label.py @@ -110,8 +110,8 @@ class CTkLabel(CTkBaseClass): self._canvas.configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode)) - def config(self, **kwargs): - return self.configure(**kwargs) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "anchor" in kwargs: diff --git a/customtkinter/widgets/ctk_optionmenu.py b/customtkinter/widgets/ctk_optionmenu.py index f07c68f..a46e2af 100644 --- a/customtkinter/widgets/ctk_optionmenu.py +++ b/customtkinter/widgets/ctk_optionmenu.py @@ -191,9 +191,8 @@ class CTkOptionMenu(CTkBaseClass): self._canvas.update_idletasks() - def _open_dropdown_menu(self): - self._dropdown_menu.open(self.winfo_rootx(), - self.winfo_rooty() + self._apply_widget_scaling(self._current_height + 0)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "state" in kwargs: @@ -268,6 +267,10 @@ class CTkOptionMenu(CTkBaseClass): super().configure(require_redraw=require_redraw, **kwargs) + def _open_dropdown_menu(self): + self._dropdown_menu.open(self.winfo_rootx(), + self.winfo_rooty() + self._apply_widget_scaling(self._current_height + 0)) + def _on_enter(self, event=0): if self._hover is True and self._state == tkinter.NORMAL and len(self._values) > 0: # set color of inner button parts to hover color diff --git a/customtkinter/widgets/ctk_progressbar.py b/customtkinter/widgets/ctk_progressbar.py index 9699c91..20bc70f 100644 --- a/customtkinter/widgets/ctk_progressbar.py +++ b/customtkinter/widgets/ctk_progressbar.py @@ -150,6 +150,9 @@ class CTkProgressBar(CTkBaseClass): fill=ThemeManager.single_color(self._progress_color, self._appearance_mode), outline=ThemeManager.single_color(self._progress_color, self._appearance_mode)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "fg_color" in kwargs: self._fg_color = kwargs.pop("fg_color") diff --git a/customtkinter/widgets/ctk_radiobutton.py b/customtkinter/widgets/ctk_radiobutton.py index 94b2fed..bb8afc6 100644 --- a/customtkinter/widgets/ctk_radiobutton.py +++ b/customtkinter/widgets/ctk_radiobutton.py @@ -156,6 +156,9 @@ class CTkRadioButton(CTkBaseClass): self._text_label.configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "text" in kwargs: self._text = kwargs.pop("text") diff --git a/customtkinter/widgets/ctk_scrollbar.py b/customtkinter/widgets/ctk_scrollbar.py index 8219188..2b7b7c3 100644 --- a/customtkinter/widgets/ctk_scrollbar.py +++ b/customtkinter/widgets/ctk_scrollbar.py @@ -148,13 +148,8 @@ class CTkScrollbar(CTkBaseClass): self._canvas.update_idletasks() - def set(self, start_value: float, end_value: float): - self._start_value = float(start_value) - self._end_value = float(end_value) - self._draw() - - def get(self): - return self._start_value, self._end_value + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "fg_color" in kwargs: @@ -222,3 +217,11 @@ class CTkScrollbar(CTkBaseClass): self._command('scroll', -int(event.delta/40), 'units') else: self._command('scroll', -event.delta, 'units') + + def set(self, start_value: float, end_value: float): + self._start_value = float(start_value) + self._end_value = float(end_value) + self._draw() + + def get(self): + return self._start_value, self._end_value diff --git a/customtkinter/widgets/ctk_slider.py b/customtkinter/widgets/ctk_slider.py index 98e3efd..f1d5bcf 100644 --- a/customtkinter/widgets/ctk_slider.py +++ b/customtkinter/widgets/ctk_slider.py @@ -188,6 +188,9 @@ class CTkSlider(CTkBaseClass): fill=ThemeManager.single_color(self._button_color, self._appearance_mode), outline=ThemeManager.single_color(self._button_color, self._appearance_mode)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): if "state" in kwargs: self._state = kwargs.pop("state") diff --git a/customtkinter/widgets/ctk_switch.py b/customtkinter/widgets/ctk_switch.py index e159c5e..83acb1d 100644 --- a/customtkinter/widgets/ctk_switch.py +++ b/customtkinter/widgets/ctk_switch.py @@ -205,68 +205,8 @@ class CTkSwitch(CTkBaseClass): self._text_label.configure(bg=ThemeManager.single_color(self._bg_color, self._appearance_mode)) - def toggle(self, event=None): - if self._state is not tkinter.DISABLED: - if self._check_state is True: - self._check_state = False - else: - self._check_state = True - - self._draw(no_color_updates=True) - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(self._onvalue if self._check_state is True else self._offvalue) - self._variable_callback_blocked = False - - if self._command is not None: - self._command() - - def select(self, from_variable_callback=False): - if self._state is not tkinter.DISABLED or from_variable_callback: - self._check_state = True - - self._draw(no_color_updates=True) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._onvalue) - self._variable_callback_blocked = False - - def deselect(self, from_variable_callback=False): - if self._state is not tkinter.DISABLED or from_variable_callback: - self._check_state = False - - self._draw(no_color_updates=True) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._offvalue) - self._variable_callback_blocked = False - - def get(self) -> Union[int, str]: - return self._onvalue if self._check_state is True else self._offvalue - - def _on_enter(self, event=0): - self._hover_state = True - - if self._state is not tkinter.DISABLED: - self._canvas.itemconfig("slider_parts", - fill=ThemeManager.single_color(self._button_hover_color, self._appearance_mode), - outline=ThemeManager.single_color(self._button_hover_color, self._appearance_mode)) - - def _on_leave(self, event=0): - self._hover_state = False - self._canvas.itemconfig("slider_parts", - fill=ThemeManager.single_color(self._button_color, self._appearance_mode), - outline=ThemeManager.single_color(self._button_color, self._appearance_mode)) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - if self._variable.get() == self._onvalue: - self.select(from_variable_callback=True) - elif self._variable.get() == self._offvalue: - self.deselect(from_variable_callback=True) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "text" in kwargs: @@ -329,3 +269,66 @@ class CTkSwitch(CTkBaseClass): require_redraw = True super().configure(require_redraw=require_redraw, **kwargs) + + def toggle(self, event=None): + if self._state is not tkinter.DISABLED: + if self._check_state is True: + self._check_state = False + else: + self._check_state = True + + self._draw(no_color_updates=True) + + if self._variable is not None: + self._variable_callback_blocked = True + self._variable.set(self._onvalue if self._check_state is True else self._offvalue) + self._variable_callback_blocked = False + + if self._command is not None: + self._command() + + def select(self, from_variable_callback=False): + if self._state is not tkinter.DISABLED or from_variable_callback: + self._check_state = True + + self._draw(no_color_updates=True) + + if self._variable is not None and not from_variable_callback: + self._variable_callback_blocked = True + self._variable.set(self._onvalue) + self._variable_callback_blocked = False + + def deselect(self, from_variable_callback=False): + if self._state is not tkinter.DISABLED or from_variable_callback: + self._check_state = False + + self._draw(no_color_updates=True) + + if self._variable is not None and not from_variable_callback: + self._variable_callback_blocked = True + self._variable.set(self._offvalue) + self._variable_callback_blocked = False + + def get(self) -> Union[int, str]: + return self._onvalue if self._check_state is True else self._offvalue + + def _on_enter(self, event=0): + self._hover_state = True + + if self._state is not tkinter.DISABLED: + self._canvas.itemconfig("slider_parts", + fill=ThemeManager.single_color(self._button_hover_color, self._appearance_mode), + outline=ThemeManager.single_color(self._button_hover_color, self._appearance_mode)) + + def _on_leave(self, event=0): + self._hover_state = False + self._canvas.itemconfig("slider_parts", + fill=ThemeManager.single_color(self._button_color, self._appearance_mode), + outline=ThemeManager.single_color(self._button_color, self._appearance_mode)) + + def _variable_callback(self, var_name, index, mode): + if not self._variable_callback_blocked: + if self._variable.get() == self._onvalue: + self.select(from_variable_callback=True) + elif self._variable.get() == self._offvalue: + self.deselect(from_variable_callback=True) diff --git a/customtkinter/widgets/ctk_textbox.py b/customtkinter/widgets/ctk_textbox.py index a011593..4fef1f9 100644 --- a/customtkinter/widgets/ctk_textbox.py +++ b/customtkinter/widgets/ctk_textbox.py @@ -116,29 +116,8 @@ class CTkTextbox(CTkBaseClass): self._canvas.tag_lower("inner_parts") self._canvas.tag_lower("border_parts") - def yview(self, *args): - return self._textbox.yview(*args) - - def xview(self, *args): - return self._textbox.xview(*args) - - def insert(self, *args, **kwargs): - return self._textbox.insert(*args, **kwargs) - - def focus(self): - return self._textbox.focus() - - def tag_add(self, *args, **kwargs): - return self._textbox.tag_add(*args, **kwargs) - - def tag_config(self, *args, **kwargs): - return self._textbox.tag_config(*args, **kwargs) - - def tag_configure(self, *args, **kwargs): - return self._textbox.tag_configure(*args, **kwargs) - - def tag_remove(self, *args, **kwargs): - return self._textbox.tag_remove(*args, **kwargs) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) def configure(self, require_redraw=False, **kwargs): if "fg_color" in kwargs: @@ -181,3 +160,27 @@ class CTkTextbox(CTkBaseClass): super().configure(require_redraw=require_redraw) self._textbox.configure(**kwargs) + + def yview(self, *args): + return self._textbox.yview(*args) + + def xview(self, *args): + return self._textbox.xview(*args) + + def insert(self, *args, **kwargs): + return self._textbox.insert(*args, **kwargs) + + def focus(self): + return self._textbox.focus() + + def tag_add(self, *args, **kwargs): + return self._textbox.tag_add(*args, **kwargs) + + def tag_config(self, *args, **kwargs): + return self._textbox.tag_config(*args, **kwargs) + + def tag_configure(self, *args, **kwargs): + return self._textbox.tag_configure(*args, **kwargs) + + def tag_remove(self, *args, **kwargs): + return self._textbox.tag_remove(*args, **kwargs) diff --git a/customtkinter/widgets/dropdown_menu.py b/customtkinter/widgets/dropdown_menu.py index cdc5819..5c28a09 100644 --- a/customtkinter/widgets/dropdown_menu.py +++ b/customtkinter/widgets/dropdown_menu.py @@ -102,6 +102,9 @@ class DropdownMenu(tkinter.Menu): else: # Linux self.tk_popup(int(x), int(y)) + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, **kwargs): if "values" in kwargs: self._values = kwargs.pop("values") diff --git a/customtkinter/widgets/widget_base_class.py b/customtkinter/widgets/widget_base_class.py index 77af625..6b74e00 100644 --- a/customtkinter/widgets/widget_base_class.py +++ b/customtkinter/widgets/widget_base_class.py @@ -117,6 +117,9 @@ class CTkBaseClass(tkinter.Frame): return scaled_kwargs + def config(self, *args, **kwargs): + return self.configure(*args, **kwargs) + def configure(self, require_redraw=False, **kwargs): """ basic configure with _bg_color support, to be overridden """