From 2db46afaf009e45682a08d8c970cea7ba2c78aa3 Mon Sep 17 00:00:00 2001 From: TomSchimansky Date: Tue, 16 Aug 2022 18:14:30 +0200 Subject: [PATCH] fixed withdraw and iconify functionality for CTk window before mainloop or update #277 #305 #302 --- customtkinter/windows/ctk_tk.py | 22 ++++++++++++++++--- customtkinter/windows/ctk_toplevel.py | 1 - .../complex_example_new.py | 3 ++- .../test_iconify_destroy.py | 16 +++++++++----- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/customtkinter/windows/ctk_tk.py b/customtkinter/windows/ctk_tk.py index 0ddbda6..89f85f7 100644 --- a/customtkinter/windows/ctk_tk.py +++ b/customtkinter/windows/ctk_tk.py @@ -52,7 +52,9 @@ class CTk(tkinter.Tk): super().title("CTk") self.geometry(f"{self.current_width}x{self.current_height}") - self.window_exists = False # indicates if the window is already shown through .update or .mainloop + self.window_exists = False # indicates if the window is already shown through update() or mainloop() + self.withdraw_called_before_window_exists = False # indicates if withdraw() was called before window is first shown through update() or mainloop() + self.iconify_called_before_window_exists = False # indicates if iconify() was called before window is first shown through update() or mainloop() if sys.platform.startswith("win"): if self.appearance_mode == 1: @@ -104,16 +106,30 @@ class CTk(tkinter.Tk): self.disable_macos_dark_title_bar() super().destroy() + def withdraw(self): + if self.window_exists is False: + self.withdraw_called_before_window_exists = True + super().withdraw() + + def iconify(self): + if self.window_exists is False: + self.iconify_called_before_window_exists = True + super().iconify() + def update(self): if self.window_exists is False: - self.deiconify() self.window_exists = True + + if not self.withdraw_called_before_window_exists and not self.iconify_called_before_window_exists: + self.deiconify() super().update() def mainloop(self, *args, **kwargs): if not self.window_exists: - self.deiconify() self.window_exists = True + + if not self.withdraw_called_before_window_exists and not self.iconify_called_before_window_exists: + self.deiconify() super().mainloop(*args, **kwargs) def resizable(self, *args, **kwargs): diff --git a/customtkinter/windows/ctk_toplevel.py b/customtkinter/windows/ctk_toplevel.py index b6bddf0..3fa4f15 100644 --- a/customtkinter/windows/ctk_toplevel.py +++ b/customtkinter/windows/ctk_toplevel.py @@ -47,7 +47,6 @@ class CTkToplevel(tkinter.Toplevel): AppearanceModeTracker.add(self.set_appearance_mode, self) super().configure(bg=ThemeManager.single_color(self.fg_color, self.appearance_mode)) super().title("CTkToplevel") - # self.geometry(f"{self._current_width}x{self._current_height}") if sys.platform.startswith("win"): if self.appearance_mode == 1: diff --git a/test/manual_integration_tests/complex_example_new.py b/test/manual_integration_tests/complex_example_new.py index 2393aa9..8b806fb 100644 --- a/test/manual_integration_tests/complex_example_new.py +++ b/test/manual_integration_tests/complex_example_new.py @@ -12,7 +12,7 @@ class App(customtkinter.CTk): super().__init__() self.title("CustomTkinter complex_example.py") - self.geometry(f"{920}x{500}-100-100") + self.geometry(f"{920}x{500}") self.protocol("WM_DELETE_WINDOW", self.on_closing) # call .on_closing() when app gets closed # configure grid layout (4x4) @@ -73,6 +73,7 @@ class App(customtkinter.CTk): dynamic_resizing=False, values=["Value 1", "Value 2", "Value Long Long Long"]) self.optionmenu_1.grid(row=0, column=0, padx=20, pady=(20, 10), sticky="ew") + self.optionmenu_1.configure(dropdown_text_font=("Times New Roman", 20)) self.combobox_1 = customtkinter.CTkComboBox(self.optionemnu_combobox_frame, values=["Value 1", "Value 2", "Value Long....."]) self.combobox_1.grid(row=1, column=0, padx=20, pady=(10, 10), sticky="ew") diff --git a/test/manual_integration_tests/test_iconify_destroy.py b/test/manual_integration_tests/test_iconify_destroy.py index f965e6f..3492547 100644 --- a/test/manual_integration_tests/test_iconify_destroy.py +++ b/test/manual_integration_tests/test_iconify_destroy.py @@ -3,16 +3,20 @@ import customtkinter app = customtkinter.CTk() app.geometry("400x240") +app.withdraw() +app.after(1000, app.deiconify) + def button_function(): - top = customtkinter.CTkToplevel(app) + top.withdraw() - app.after(1000, top.iconify) # hide toplevel - app.after(1500, top.deiconify) # show toplevel - app.after(2500, app.iconify) # hide app - app.after(3000, app.deiconify) # show app - app.after(4000, app.destroy) # destroy everything + app.after(1000, top.deiconify) # show toplevel + app.after(2000, top.iconify) # hide toplevel + app.after(2500, top.deiconify) # show toplevel + app.after(3500, app.iconify) # hide app + app.after(4000, app.deiconify) # show app + app.after(5000, app.destroy) # destroy everything button = customtkinter.CTkButton(app, command=button_function)