From 786a5148de2b8c97562acb544ef0c32bba3d0240 Mon Sep 17 00:00:00 2001 From: TomSchimansky Date: Sun, 5 Feb 2023 21:41:23 +0100 Subject: [PATCH] finished scrollable frame, added example and test for scrollable frame --- Readme.md | 6 + customtkinter/assets/themes/blue.json | 3 + .../core_widget_classes/ctk_base_class.py | 7 +- customtkinter/windows/widgets/ctk_button.py | 1 + .../windows/widgets/ctk_scrollable_frame.py | 285 +++++++++++++----- .../scrollable_frame_example_Windows.png | Bin 0 -> 88975 bytes examples/complex_example.py | 40 ++- examples/scrollable_frame_example.py | 132 ++++++++ .../test_scrollable_frame.py | 37 +++ 9 files changed, 415 insertions(+), 96 deletions(-) create mode 100644 documentation_images/scrollable_frame_example_Windows.png create mode 100644 examples/scrollable_frame_example.py create mode 100644 test/manual_integration_tests/test_scrollable_frame.py diff --git a/Readme.md b/Readme.md index dca878d..c592de1 100644 --- a/Readme.md +++ b/Readme.md @@ -105,6 +105,12 @@ how to position the text and image at once with the ``compound`` option: | _`image_example.py` on Windows 11_ ### +### Scrollable Frames +Scrollable frames are possible in vertical or horizontal orientation and can be combined +with any other widgets. +![](documentation_images/scrollable_frame_example_Windows.png) +| _`scrollable_frame_example.py` on Windows 11_ + ### Integration of TkinterMapView widget In the following example I used a TkinterMapView which integrates well with a CustomTkinter program. It's a tile based map widget which displays diff --git a/customtkinter/assets/themes/blue.json b/customtkinter/assets/themes/blue.json index 73a1f4d..838e26b 100644 --- a/customtkinter/assets/themes/blue.json +++ b/customtkinter/assets/themes/blue.json @@ -127,6 +127,9 @@ "scrollbar_button_color": ["gray55", "gray41"], "scrollbar_button_hover_color": ["gray40", "gray53"] }, + "CTkScrollableFrame": { + "label_fg_color": ["gray78", "gray23"] + }, "DropdownMenu": { "fg_color": ["gray90", "gray20"], "hover_color": ["gray75", "gray28"], diff --git a/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py b/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py index 5f119bf..610f46a 100644 --- a/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py +++ b/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py @@ -193,12 +193,15 @@ class CTkBaseClass(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClas if master_widget is None: master_widget = self.master - if isinstance(master_widget, (windows.widgets.core_widget_classes.CTkBaseClass, windows.CTk, windows.CTkToplevel)): + if isinstance(master_widget, (windows.widgets.core_widget_classes.CTkBaseClass, windows.CTk, windows.CTkToplevel, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame)): if master_widget.cget("fg_color") is not None and master_widget.cget("fg_color") != "transparent": return master_widget.cget("fg_color") + elif isinstance(master_widget, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame): + return self._detect_color_of_master(master_widget.master.master.master) + # if fg_color of master is None, try to retrieve fg_color from master of master - elif hasattr(master_widget.master, "master"): + elif hasattr(master_widget, "master"): return self._detect_color_of_master(master_widget.master) elif isinstance(master_widget, (ttk.Frame, ttk.LabelFrame, ttk.Notebook, ttk.Label)): # master is ttk widget diff --git a/customtkinter/windows/widgets/ctk_button.py b/customtkinter/windows/widgets/ctk_button.py index 0648d92..d79a944 100644 --- a/customtkinter/windows/widgets/ctk_button.py +++ b/customtkinter/windows/widgets/ctk_button.py @@ -428,6 +428,7 @@ class CTkButton(CTkBaseClass): if "command" in kwargs: self._command = kwargs.pop("command") + self._set_cursor() if "compound" in kwargs: self._compound = kwargs.pop("compound") diff --git a/customtkinter/windows/widgets/ctk_scrollable_frame.py b/customtkinter/windows/widgets/ctk_scrollable_frame.py index 1017e2c..99e4269 100644 --- a/customtkinter/windows/widgets/ctk_scrollable_frame.py +++ b/customtkinter/windows/widgets/ctk_scrollable_frame.py @@ -9,10 +9,14 @@ import sys from .ctk_frame import CTkFrame from .ctk_scrollbar import CTkScrollbar from .appearance_mode import CTkAppearanceModeBaseClass +from .scaling import CTkScalingBaseClass from .core_widget_classes import CTkBaseClass +from .ctk_label import CTkLabel +from .font import CTkFont +from .theme import ThemeManager -class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass): +class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClass): def __init__(self, master: any, width: int = 200, @@ -23,121 +27,246 @@ class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass): bg_color: Union[str, Tuple[str, str]] = "transparent", fg_color: Optional[Union[str, Tuple[str, str]]] = None, border_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_fg_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_button_color: Optional[Union[str, Tuple[str, str]]] = None, + scrollbar_button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, + label_fg_color: Optional[Union[str, Tuple[str, str]]] = None, + label_text_color: Optional[Union[str, Tuple[str, str]]] = None, + label_text: str = "", + label_font: Optional[Union[tuple, CTkFont]] = None, + label_anchor: str = "center", orientation: Literal["vertical", "horizontal"] = "vertical"): self._orientation = orientation - self.parent_frame = CTkFrame(master=master, width=width, height=height, corner_radius=corner_radius, - border_width=border_width, bg_color=bg_color, fg_color=fg_color, border_color=border_color) - self.parent_frame.grid_propagate(0) - self.parent_canvas = tkinter.Canvas(master=self.parent_frame, highlightthickness=0, width=0, height=0) + # 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 + + self._parent_frame = CTkFrame(master=master, width=0, height=0, corner_radius=corner_radius, + border_width=border_width, bg_color=bg_color, fg_color=fg_color, border_color=border_color) + self._parent_canvas = tkinter.Canvas(master=self._parent_frame, highlightthickness=0) self._set_scroll_increments() if self._orientation == "horizontal": - self.scrollbar = CTkScrollbar(master=self.parent_frame, orientation="horizontal", command=self.parent_canvas.xview) - self.parent_canvas.configure(xscrollcommand=self.scrollbar.set) + self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="horizontal", command=self._parent_canvas.xview, + fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) + self._parent_canvas.configure(xscrollcommand=self._scrollbar.set) elif self._orientation == "vertical": - self.scrollbar = CTkScrollbar(master=self.parent_frame, orientation="vertical", command=self.parent_canvas.yview) - self.parent_canvas.configure(yscrollcommand=self.scrollbar.set) + self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="vertical", command=self._parent_canvas.yview, + fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) + self._parent_canvas.configure(yscrollcommand=self._scrollbar.set) + + self._label_text = label_text + self._label = CTkLabel(self._parent_frame, text=label_text, anchor=label_anchor, font=label_font, + corner_radius=self._parent_frame.cget("corner_radius"), text_color=label_text_color, + fg_color=ThemeManager.theme["CTkScrollableFrame"]["label_fg_color"] if label_fg_color is None else label_fg_color) + + tkinter.Frame.__init__(self, master=self._parent_canvas, highlightthickness=0) + CTkAppearanceModeBaseClass.__init__(self) + CTkScalingBaseClass.__init__(self, scaling_type="widget") + self._create_grid() - tkinter.Frame.__init__(self, master=self.parent_canvas, highlightthickness=0) - CTkAppearanceModeBaseClass.__init__(self) + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) - self.bind("", lambda e: self.parent_canvas.configure(scrollregion=self.parent_canvas.bbox("all"))) - self.parent_canvas.bind("", self._fit_frame_dimensions_to_canvas) - self.bind_all("", self._mouse_wheel_all) - self.bind_all("", self._keyboard_shift_press_all) - self.bind_all("", self._keyboard_shift_press_all) - self.bind_all("", self._keyboard_shift_release_all) - self.bind_all("", self._keyboard_shift_release_all) - self._create_window_id = self.parent_canvas.create_window(0, 0, window=self, anchor="nw") + self.bind("", lambda e: self._parent_canvas.configure(scrollregion=self._parent_canvas.bbox("all"))) + self._parent_canvas.bind("", self._fit_frame_dimensions_to_canvas) + self.bind_all("", self._mouse_wheel_all, add="+") + self.bind_all("", self._keyboard_shift_press_all, add="+") + self.bind_all("", self._keyboard_shift_press_all, add="+") + self.bind_all("", self._keyboard_shift_release_all, add="+") + self.bind_all("", self._keyboard_shift_release_all, add="+") + self._create_window_id = self._parent_canvas.create_window(0, 0, window=self, anchor="nw") - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self.parent_frame.cget("fg_color"))) + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) self._shift_pressed = False def destroy(self): tkinter.Frame.destroy(self) CTkAppearanceModeBaseClass.destroy(self) + CTkScalingBaseClass.destroy(self) + + def _create_grid(self): + border_spacing = self._apply_widget_scaling(self._parent_frame.cget("corner_radius") + self._parent_frame.cget("border_width")) + + if self._orientation == "horizontal": + self._parent_frame.grid_columnconfigure(0, weight=1) + self._parent_frame.grid_rowconfigure(1, weight=1) + self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=border_spacing, pady=(border_spacing, 0)) + self._scrollbar.grid(row=2, column=0, sticky="nsew", padx=border_spacing) + + if self._label_text is not None and self._label_text != "": + self._label.grid(row=0, column=0, sticky="ew", padx=border_spacing, pady=border_spacing) + else: + self._label.grid_forget() + + elif self._orientation == "vertical": + self._parent_frame.grid_columnconfigure(0, weight=1) + self._parent_frame.grid_rowconfigure(1, weight=1) + self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=(border_spacing, 0), pady=border_spacing) + self._scrollbar.grid(row=1, column=1, sticky="nsew", padx=border_spacing) + + if self._label_text is not None and self._label_text != "": + self._label.grid(row=0, column=0, columnspan=2, sticky="ew", padx=border_spacing, pady=border_spacing) + else: + self._label.grid_forget() def _set_appearance_mode(self, mode_string): super()._set_appearance_mode(mode_string) - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self.parent_frame.cget("fg_color"))) + + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + + def _set_scaling(self, new_widget_scaling, new_window_scaling): + super()._set_scaling(new_widget_scaling, new_window_scaling) + + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) + + def _set_dimensions(self, width=None, height=None): + if width is not None: + self._desired_width = width + if height is not None: + self._desired_height = height + + self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), + height=self._apply_widget_scaling(self._desired_height)) def configure(self, **kwargs): - if "fg_color" in kwargs: - self.parent_frame.configure(fg_color=kwargs.pop("fg_color")) - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self.parent_frame.cget("fg_color"))) - - for child in self.winfo_children(): - if isinstance(child, CTkBaseClass): - child.configure(bg_color=self.parent_frame.cget("fg_color")) - if "corner_radius" in kwargs: - self.parent_frame.configure(corner_radius=kwargs.pop("corner_radius")) + new_corner_radius = kwargs.pop("corner_radius") + self._parent_frame.configure(corner_radius=new_corner_radius) + if self._label is not None: + self._label.configure(corner_radius=new_corner_radius) self._create_grid() if "border_width" in kwargs: - self.parent_frame.configure(border_width=kwargs.pop("border_width")) + self._parent_frame.configure(border_width=kwargs.pop("border_width")) self._create_grid() - self.parent_frame.configure(**kwargs) + if "fg_color" in kwargs: + self._parent_frame.configure(fg_color=kwargs.pop("fg_color")) + + if self._parent_frame.cget("fg_color") == "transparent": + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) + else: + tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) + + for child in self.winfo_children(): + if isinstance(child, CTkBaseClass): + child.configure(bg_color=self._parent_frame.cget("fg_color")) + + if "scrollbar_fg_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_fg_color")) + + if "scrollbar_button_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_button_color")) + + if "scrollbar_button_hover_color" in kwargs: + self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_button_hover_color")) + + if "width" in kwargs: + self._set_dimensions(width=kwargs.pop("width")) + + if "height" in kwargs: + self._set_dimensions(height=kwargs.pop("height")) + + if "label_text" in kwargs: + self._label_text = kwargs.pop("label_text") + self._label.configure(text=self._label_text) + self._create_grid() + + if "label_font" in kwargs: + self._label.configure(font=kwargs.pop("label_font")) + + if "label_text_color" in kwargs: + self._label.configure(text_color=kwargs.pop("label_text_color")) + + if "label_fg_color" in kwargs: + self._label.configure(fg_color=kwargs.pop("label_fg_color")) + + if "label_anchor" in kwargs: + self._label.configure(anchor=kwargs.pop("label_anchor")) + + self._parent_frame.configure(**kwargs) + + def cget(self, attribute_name: str): + if attribute_name == "width": + return self._desired_width + elif attribute_name == "height": + return self._desired_height + + elif attribute_name == "label_text": + return self._label_text + elif attribute_name == "label_font": + return self._label.cget("font") + elif attribute_name == "label_text_color": + return self._label.cget("_text_color") + elif attribute_name == "label_fg_color": + return self._label.cget("fg_color") + elif attribute_name == "label_anchor": + return self._label.cget("anchor") + + elif attribute_name.startswith("scrollbar_fg_color"): + return self._scrollbar.cget("fg_color") + elif attribute_name.startswith("scrollbar_button_color"): + return self._scrollbar.cget("button_color") + elif attribute_name.startswith("scrollbar_button_hover_color"): + return self._scrollbar.cget("button_hover_color") + + else: + return self._parent_frame.cget(attribute_name) def _fit_frame_dimensions_to_canvas(self, event): if self._orientation == "horizontal": - self.parent_canvas.itemconfigure(self._create_window_id, height=self.parent_canvas.winfo_height()) + self._parent_canvas.itemconfigure(self._create_window_id, height=self._parent_canvas.winfo_height()) elif self._orientation == "vertical": - self.parent_canvas.itemconfigure(self._create_window_id, width=self.parent_canvas.winfo_width()) + self._parent_canvas.itemconfigure(self._create_window_id, width=self._parent_canvas.winfo_width()) def _set_scroll_increments(self): if sys.platform.startswith("win"): - self.parent_canvas.configure(xscrollincrement=1, yscrollincrement=1) + self._parent_canvas.configure(xscrollincrement=1, yscrollincrement=1) elif sys.platform == "darwin": - self.parent_canvas.configure(xscrollincrement=4, yscrollincrement=8) - - def _create_grid(self): - border_spacing = self.parent_frame.cget("corner_radius") + self.parent_frame.cget("border_width") - self.parent_frame.grid_columnconfigure(0, weight=1) - self.parent_frame.grid_rowconfigure(0, weight=1) - - if self._orientation == "horizontal": - self.parent_frame.grid_rowconfigure(1, weight=0) - self.parent_canvas.grid(row=0, column=0, sticky="nsew", - padx=border_spacing, pady=(border_spacing, 0)) - self.scrollbar.grid(row=1, column=0, sticky="nsew", - padx=border_spacing) - elif self._orientation == "vertical": - self.parent_frame.grid_columnconfigure(1, weight=0) - self.parent_canvas.grid(row=0, column=0, sticky="nsew", - pady=border_spacing, padx=(border_spacing, 0)) - self.scrollbar.grid(row=0, column=1, sticky="nsew", - pady=border_spacing) + self._parent_canvas.configure(xscrollincrement=4, yscrollincrement=8) def _mouse_wheel_all(self, event): if self.check_if_master_is_canvas(event.widget): if sys.platform.startswith("win"): if self._shift_pressed: - if self.parent_canvas.xview() != (0.0, 1.0): - self.parent_canvas.xview("scroll", -int(event.delta/6), "units") + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -int(event.delta / 6), "units") else: - if self.parent_canvas.yview() != (0.0, 1.0): - self.parent_canvas.yview("scroll", -int(event.delta/6), "units") + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -int(event.delta / 6), "units") elif sys.platform == "darwin": if self._shift_pressed: - if self.parent_canvas.xview() != (0.0, 1.0): - self.parent_canvas.xview("scroll", -event.delta, "units") + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -event.delta, "units") else: - if self.parent_canvas.yview() != (0.0, 1.0): - self.parent_canvas.yview("scroll", -event.delta, "units") + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -event.delta, "units") else: if self._shift_pressed: - if self.parent_canvas.xview() != (0.0, 1.0): - self.parent_canvas.xview("scroll", -event.delta, "units") + if self._parent_canvas.xview() != (0.0, 1.0): + self._parent_canvas.xview("scroll", -event.delta, "units") else: - if self.parent_canvas.yview() != (0.0, 1.0): - self.parent_canvas.yview("scroll", -event.delta, "units") + if self._parent_canvas.yview() != (0.0, 1.0): + self._parent_canvas.yview("scroll", -event.delta, "units") def _keyboard_shift_press_all(self, event): self._shift_pressed = True @@ -146,7 +275,7 @@ class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass): self._shift_pressed = False def check_if_master_is_canvas(self, widget): - if widget == self.parent_canvas: + if widget == self._parent_canvas: return True elif widget.master is not None: return self.check_if_master_is_canvas(widget.master) @@ -154,34 +283,34 @@ class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass): return False def pack(self, **kwargs): - self.parent_frame.pack(**kwargs) + self._parent_frame.pack(**kwargs) def place(self, **kwargs): - self.parent_frame.place(**kwargs) + self._parent_frame.place(**kwargs) def grid(self, **kwargs): - self.parent_frame.grid(**kwargs) + self._parent_frame.grid(**kwargs) def pack_forget(self): - self.parent_frame.pack_forget() + self._parent_frame.pack_forget() def place_forget(self, **kwargs): - self.parent_frame.place_forget() + self._parent_frame.place_forget() def grid_forget(self, **kwargs): - self.parent_frame.grid_forget() + self._parent_frame.grid_forget() def grid_remove(self, **kwargs): - self.parent_frame.grid_remove() + self._parent_frame.grid_remove() def grid_propagate(self, **kwargs): - self.parent_frame.grid_propagate() + self._parent_frame.grid_propagate() def grid_info(self, **kwargs): - self.parent_frame.grid_info() + return self._parent_frame.grid_info() def lift(self, aboveThis=None): - self.parent_frame.lift(aboveThis) + self._parent_frame.lift(aboveThis) def lower(self, belowThis=None): - self.parent_frame.lower(belowThis) + self._parent_frame.lower(belowThis) diff --git a/documentation_images/scrollable_frame_example_Windows.png b/documentation_images/scrollable_frame_example_Windows.png new file mode 100644 index 0000000000000000000000000000000000000000..9b74602ceba11b6d21ca3f9ab7ee868146ccf192 GIT binary patch literal 88975 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 Q+W-In07*qoM6N<$f;2M$R{#J2 literal 0 HcmV?d00001 diff --git a/examples/complex_example.py b/examples/complex_example.py index 978a706..072bc64 100644 --- a/examples/complex_example.py +++ b/examples/complex_example.py @@ -87,21 +87,9 @@ class App(customtkinter.CTk): self.radio_button_3 = customtkinter.CTkRadioButton(master=self.radiobutton_frame, variable=self.radio_var, value=2) self.radio_button_3.grid(row=3, column=2, pady=10, padx=20, sticky="n") - # create checkbox and switch frame - self.checkbox_slider_frame = customtkinter.CTkFrame(self) - self.checkbox_slider_frame.grid(row=1, column=3, padx=(20, 20), pady=(20, 0), sticky="nsew") - self.checkbox_1 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame) - self.checkbox_1.grid(row=1, column=0, pady=(20, 10), padx=20, sticky="n") - self.checkbox_2 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame) - self.checkbox_2.grid(row=2, column=0, pady=10, padx=20, sticky="n") - self.switch_1 = customtkinter.CTkSwitch(master=self.checkbox_slider_frame, command=lambda: print("switch 1 toggle")) - self.switch_1.grid(row=3, column=0, pady=10, padx=20, sticky="n") - self.switch_2 = customtkinter.CTkSwitch(master=self.checkbox_slider_frame) - self.switch_2.grid(row=4, column=0, pady=(10, 20), padx=20, sticky="n") - # create slider and progressbar frame self.slider_progressbar_frame = customtkinter.CTkFrame(self, fg_color="transparent") - self.slider_progressbar_frame.grid(row=1, column=1, columnspan=2, padx=(20, 0), pady=(20, 0), sticky="nsew") + self.slider_progressbar_frame.grid(row=1, column=1, padx=(20, 0), pady=(20, 0), sticky="nsew") self.slider_progressbar_frame.grid_columnconfigure(0, weight=1) self.slider_progressbar_frame.grid_rowconfigure(4, weight=1) self.seg_button_1 = customtkinter.CTkSegmentedButton(self.slider_progressbar_frame) @@ -117,12 +105,32 @@ class App(customtkinter.CTk): self.progressbar_3 = customtkinter.CTkProgressBar(self.slider_progressbar_frame, orientation="vertical") self.progressbar_3.grid(row=0, column=2, rowspan=5, padx=(10, 20), pady=(10, 10), sticky="ns") + # create scrollable frame + self.scrollable_frame = customtkinter.CTkScrollableFrame(self, label_text="CTkScrollableFrame") + self.scrollable_frame.grid(row=1, column=2, padx=(20, 0), pady=(20, 0), sticky="nsew") + self.scrollable_frame.grid_columnconfigure(0, weight=1) + self.scrollable_frame_switches = [] + for i in range(100): + switch = customtkinter.CTkSwitch(master=self.scrollable_frame, text=f"CTkSwitch {i}") + switch.grid(row=i, column=0, padx=10, pady=(0, 20)) + self.scrollable_frame_switches.append(switch) + + # create checkbox and switch frame + self.checkbox_slider_frame = customtkinter.CTkFrame(self) + self.checkbox_slider_frame.grid(row=1, column=3, padx=(20, 20), pady=(20, 0), sticky="nsew") + self.checkbox_1 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame) + self.checkbox_1.grid(row=1, column=0, pady=(20, 0), padx=20, sticky="n") + self.checkbox_2 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame) + self.checkbox_2.grid(row=2, column=0, pady=(20, 0), padx=20, sticky="n") + self.checkbox_3 = customtkinter.CTkCheckBox(master=self.checkbox_slider_frame) + self.checkbox_3.grid(row=3, column=0, pady=20, padx=20, sticky="n") + # set default values self.sidebar_button_3.configure(state="disabled", text="Disabled CTkButton") - self.checkbox_2.configure(state="disabled") - self.switch_2.configure(state="disabled") + self.checkbox_3.configure(state="disabled") self.checkbox_1.select() - self.switch_1.select() + self.scrollable_frame_switches[0].select() + self.scrollable_frame_switches[4].select() self.radio_button_3.configure(state="disabled") self.appearance_mode_optionemenu.set("Dark") self.scaling_optionemenu.set("100%") diff --git a/examples/scrollable_frame_example.py b/examples/scrollable_frame_example.py new file mode 100644 index 0000000..06e3986 --- /dev/null +++ b/examples/scrollable_frame_example.py @@ -0,0 +1,132 @@ +import customtkinter +import os +from PIL import Image + + +class ScrollableCheckBoxFrame(customtkinter.CTkScrollableFrame): + def __init__(self, master, item_list, command=None, **kwargs): + super().__init__(master, **kwargs) + + self.command = command + self.checkbox_list = [] + for i, item in enumerate(item_list): + self.add_item(item) + + def add_item(self, item): + checkbox = customtkinter.CTkCheckBox(self, text=item) + if self.command is not None: + checkbox.configure(command=self.command) + checkbox.grid(row=len(self.checkbox_list), column=0, pady=(0, 10)) + self.checkbox_list.append(checkbox) + + def remove_item(self, item): + for checkbox in self.checkbox_list: + if item == checkbox.cget("text"): + checkbox.destroy() + self.checkbox_list.remove(checkbox) + return + + def get_checked_items(self): + return [checkbox.cget("text") for checkbox in self.checkbox_list if checkbox.get() == 1] + + +class ScrollableRadiobuttonFrame(customtkinter.CTkScrollableFrame): + def __init__(self, master, item_list, command=None, **kwargs): + super().__init__(master, **kwargs) + + self.command = command + self.radiobutton_variable = customtkinter.StringVar() + self.radiobutton_list = [] + for i, item in enumerate(item_list): + self.add_item(item) + + def add_item(self, item): + radiobutton = customtkinter.CTkRadioButton(self, text=item, value=item, variable=self.radiobutton_variable) + if self.command is not None: + radiobutton.configure(command=self.command) + radiobutton.grid(row=len(self.radiobutton_list), column=0, pady=(0, 10)) + self.radiobutton_list.append(radiobutton) + + def remove_item(self, item): + for radiobutton in self.radiobutton_list: + if item == radiobutton.cget("text"): + radiobutton.destroy() + self.radiobutton_list.remove(radiobutton) + return + + def get_checked_item(self): + return self.radiobutton_variable.get() + + +class ScrollableLabelButtonFrame(customtkinter.CTkScrollableFrame): + def __init__(self, master, command=None, **kwargs): + super().__init__(master, **kwargs) + self.grid_columnconfigure(0, weight=1) + + self.command = command + self.radiobutton_variable = customtkinter.StringVar() + self.label_list = [] + self.button_list = [] + + def add_item(self, item, image=None): + label = customtkinter.CTkLabel(self, text=item, image=image, compound="left", padx=5, anchor="w") + button = customtkinter.CTkButton(self, text="Command", width=100, height=24) + if self.command is not None: + button.configure(command=lambda: self.command(item)) + label.grid(row=len(self.label_list), column=0, pady=(0, 10), sticky="w") + button.grid(row=len(self.button_list), column=1, pady=(0, 10), padx=5) + self.label_list.append(label) + self.button_list.append(button) + + def remove_item(self, item): + for label, button in zip(self.label_list, self.button_list): + if item == label.cget("text"): + label.destroy() + button.destroy() + self.label_list.remove(label) + self.button_list.remove(button) + return + + +class App(customtkinter.CTk): + def __init__(self): + super().__init__() + + self.title("CTkScrollableFrame example") + self.grid_rowconfigure(0, weight=1) + self.columnconfigure(2, weight=1) + + # create scrollable checkbox frame + self.scrollable_checkbox_frame = ScrollableCheckBoxFrame(master=self, width=200, command=self.checkbox_frame_event, + item_list=[f"item {i}" for i in range(50)]) + self.scrollable_checkbox_frame.grid(row=0, column=0, padx=15, pady=15, sticky="ns") + self.scrollable_checkbox_frame.add_item("new item") + + # create scrollable radiobutton frame + self.scrollable_radiobutton_frame = ScrollableRadiobuttonFrame(master=self, width=500, command=self.radiobutton_frame_event, + item_list=[f"item {i}" for i in range(100)]) + self.scrollable_radiobutton_frame.grid(row=0, column=1, padx=15, pady=15, sticky="ns") + self.scrollable_radiobutton_frame.configure(width=200) + self.scrollable_radiobutton_frame.remove_item("item 3") + + # create scrollable label and button frame + current_dir = os.path.dirname(os.path.abspath(__file__)) + self.scrollable_label_button_frame = ScrollableLabelButtonFrame(master=self, width=300, command=self.label_button_frame_event, corner_radius=0) + self.scrollable_label_button_frame.grid(row=0, column=2, padx=0, pady=0, sticky="nsew") + for i in range(20): # add items with images + self.scrollable_label_button_frame.add_item(f"image and item {i}", image=customtkinter.CTkImage(Image.open(os.path.join(current_dir, "test_images", "chat_light.png")))) + + def checkbox_frame_event(self): + print(f"checkbox frame modified: {self.scrollable_checkbox_frame.get_checked_items()}") + + def radiobutton_frame_event(self): + print(f"radiobutton frame modified: {self.scrollable_radiobutton_frame.get_checked_item()}") + + def label_button_frame_event(self, item): + print(f"label button frame clicked: {item}") + + +if __name__ == "__main__": + customtkinter.set_appearance_mode("dark") + app = App() + app.mainloop() diff --git a/test/manual_integration_tests/test_scrollable_frame.py b/test/manual_integration_tests/test_scrollable_frame.py new file mode 100644 index 0000000..c7c0127 --- /dev/null +++ b/test/manual_integration_tests/test_scrollable_frame.py @@ -0,0 +1,37 @@ +import customtkinter + + +app = customtkinter.CTk() +app.grid_columnconfigure(2, weight=1) +app.grid_rowconfigure(1, weight=1) + +toplevel = customtkinter.CTkToplevel() +switch = customtkinter.CTkSwitch(toplevel, text="Mode", command=lambda: customtkinter.set_appearance_mode("dark" if switch.get() == 1 else "light")) +switch.grid(row=0, column=0, padx=50, pady=50) + +frame_1 = customtkinter.CTkScrollableFrame(app, orientation="vertical", label_text="should not appear", fg_color="transparent") +frame_1.grid(row=0, column=0, padx=20, pady=20) +frame_1.configure(label_text=None) + +frame_2 = customtkinter.CTkScrollableFrame(app, orientation="vertical", label_text="CTkScrollableFrame") +frame_2.grid(row=1, column=0, padx=20, pady=20) + +frame_3 = customtkinter.CTkScrollableFrame(app, orientation="horizontal") +frame_3.grid(row=0, column=1, padx=20, pady=20) + +frame_4 = customtkinter.CTkScrollableFrame(app, orientation="horizontal", label_fg_color="transparent") +frame_4.grid(row=1, column=1, padx=20, pady=20) +frame_4.configure(label_text="CTkScrollableFrame") + +frame_5 = customtkinter.CTkScrollableFrame(app, orientation="vertical", label_text="CTkScrollableFrame", corner_radius=0) +frame_5.grid(row=0, column=2, rowspan=2, sticky="nsew") + +for i in range(100): + customtkinter.CTkCheckBox(frame_1).grid(row=i, padx=10, pady=10) + customtkinter.CTkCheckBox(frame_2).grid(row=i, padx=10, pady=10) + customtkinter.CTkCheckBox(frame_3).grid(row=0, column=i, padx=10, pady=10) + customtkinter.CTkCheckBox(frame_4).grid(row=0, column=i, padx=10, pady=10) + customtkinter.CTkCheckBox(frame_5).grid(row=i, padx=10, pady=10) + + +app.mainloop()