diff --git a/customtkinter/windows/widgets/ctk_radiobutton.py b/customtkinter/windows/widgets/ctk_radiobutton.py index c07cd1f0..3a789c2e 100644 --- a/customtkinter/windows/widgets/ctk_radiobutton.py +++ b/customtkinter/windows/widgets/ctk_radiobutton.py @@ -287,6 +287,9 @@ def configure(self, require_redraw=False, **kwargs): self._check_state = True if self._variable.get() == self._value else False require_redraw = True + if "value" in kwargs: + self._value = kwargs.pop("value") + super().configure(require_redraw=require_redraw, **kwargs) def cget(self, attribute_name: str) -> any: diff --git a/customtkinter/windows/widgets/ctk_tabview.py b/customtkinter/windows/widgets/ctk_tabview.py index 3b2ea5bb..ec2aed2a 100644 --- a/customtkinter/windows/widgets/ctk_tabview.py +++ b/customtkinter/windows/widgets/ctk_tabview.py @@ -2,6 +2,7 @@ from typing import Union, Tuple, Dict, List, Callable, Optional, Any from .theme import ThemeManager +from .font import CTkFont from .ctk_frame import CTkFrame from .core_rendering import CTkCanvas from .core_rendering import DrawEngine @@ -39,6 +40,7 @@ def __init__(self, text_color: Optional[Union[str, Tuple[str, str]]] = None, text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, + font: Optional[Union[tuple, CTkFont]] = None, command: Union[Callable, Any] = None, anchor: str = "center", @@ -48,6 +50,9 @@ def __init__(self, # transfer some functionality to CTkFrame super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) + # font + segmented_button_font = CTkFont() if font is None else font + # color self._border_color = ThemeManager.theme["CTkFrame"]["border_color"] if border_color is None else self._check_color_type(border_color) @@ -85,6 +90,7 @@ def __init__(self, unselected_hover_color=segmented_button_unselected_hover_color, text_color=text_color, text_color_disabled=text_color_disabled, + font=segmented_button_font, corner_radius=corner_radius, border_width=self._segmented_button_border_width, command=self._segmented_button_callback, @@ -277,6 +283,8 @@ def configure(self, require_redraw=False, **kwargs): self._segmented_button.configure(text_color=kwargs.pop("text_color")) if "text_color_disabled" in kwargs: self._segmented_button.configure(text_color_disabled=kwargs.pop("text_color_disabled")) + if "font" in kwargs: + self._segmented_button.configure(font=kwargs.pop("font")) if "command" in kwargs: self._command = kwargs.pop("command") @@ -313,6 +321,8 @@ def cget(self, attribute_name: str): return self._segmented_button.cget(attribute_name) elif attribute_name == "text_color_disabled": return self._segmented_button.cget(attribute_name) + elif attribute_name == "font": + return self._segmented_button.cget(attribute_name) elif attribute_name == "command": return self._command diff --git a/customtkinter/windows/widgets/image/ctk_image.py b/customtkinter/windows/widgets/image/ctk_image.py index 0247cdd3..498873c0 100644 --- a/customtkinter/windows/widgets/image/ctk_image.py +++ b/customtkinter/windows/widgets/image/ctk_image.py @@ -1,4 +1,4 @@ -from typing import Tuple, Dict, Callable, List +from typing import Tuple, Dict, Callable, List, Any try: from PIL import Image, ImageTk except ImportError: @@ -21,7 +21,8 @@ class CTkImage: def __init__(self, light_image: "Image.Image" = None, dark_image: "Image.Image" = None, - size: Tuple[int, int] = (20, 20)): + size: Tuple[int, int] = (20, 20), + master: Any = None): if not self._checked_PIL_import: self._check_pil_import() @@ -31,6 +32,8 @@ def __init__(self, self._check_images() self._size = size + self._master = master + self._configure_callback_list: List[Callable] = [] self._scaled_light_photo_images: Dict[Tuple[int, int], ImageTk.PhotoImage] = {} self._scaled_dark_photo_images: Dict[Tuple[int, int], ImageTk.PhotoImage] = {} @@ -96,14 +99,14 @@ def _get_scaled_light_photo_image(self, scaled_size: Tuple[int, int]) -> "ImageT if scaled_size in self._scaled_light_photo_images: return self._scaled_light_photo_images[scaled_size] else: - self._scaled_light_photo_images[scaled_size] = ImageTk.PhotoImage(self._light_image.resize(scaled_size)) + self._scaled_light_photo_images[scaled_size] = ImageTk.PhotoImage(self._light_image.resize(scaled_size), master=self._master) return self._scaled_light_photo_images[scaled_size] def _get_scaled_dark_photo_image(self, scaled_size: Tuple[int, int]) -> "ImageTk.PhotoImage": if scaled_size in self._scaled_dark_photo_images: return self._scaled_dark_photo_images[scaled_size] else: - self._scaled_dark_photo_images[scaled_size] = ImageTk.PhotoImage(self._dark_image.resize(scaled_size)) + self._scaled_dark_photo_images[scaled_size] = ImageTk.PhotoImage(self._dark_image.resize(scaled_size), master=self._master) return self._scaled_dark_photo_images[scaled_size] def create_scaled_photo_image(self, widget_scaling: float, appearance_mode: str) -> "ImageTk.PhotoImage":