mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
fix switch and radiobutton background color #867, check if user set titlebar icon on Windows
This commit is contained in:
parent
359226e468
commit
7cb8f64dec
@ -40,14 +40,6 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass):
|
|||||||
CTkScalingBaseClass.__init__(self, scaling_type="window")
|
CTkScalingBaseClass.__init__(self, scaling_type="window")
|
||||||
check_kwargs_empty(kwargs, raise_error=True)
|
check_kwargs_empty(kwargs, raise_error=True)
|
||||||
|
|
||||||
try:
|
|
||||||
# Set Windows titlebar icon
|
|
||||||
if sys.platform.startswith("win"):
|
|
||||||
customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
||||||
self.after(200, lambda: self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico")))
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
self._current_width = 600 # initial window size, independent of scaling
|
self._current_width = 600 # initial window size, independent of scaling
|
||||||
self._current_height = 500
|
self._current_height = 500
|
||||||
self._min_width: int = 0
|
self._min_width: int = 0
|
||||||
@ -61,23 +53,28 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass):
|
|||||||
# set bg of tkinter.Tk
|
# set bg of tkinter.Tk
|
||||||
super().configure(bg=self._apply_appearance_mode(self._fg_color))
|
super().configure(bg=self._apply_appearance_mode(self._fg_color))
|
||||||
|
|
||||||
# set title and initial geometry
|
# set title
|
||||||
self.title("CTk")
|
self.title("CTk")
|
||||||
# self.geometry(f"{self._current_width}x{self._current_height}")
|
|
||||||
|
|
||||||
|
# indicator variables
|
||||||
|
self._iconbitmap_method_called = False # indicates if wm_iconbitmap method got called
|
||||||
self._state_before_windows_set_titlebar_color = None
|
self._state_before_windows_set_titlebar_color = None
|
||||||
self._window_exists = False # indicates if the window is already shown through update() or mainloop() after init
|
self._window_exists = False # indicates if the window is already shown through update() or mainloop() after init
|
||||||
self._withdraw_called_before_window_exists = False # indicates if withdraw() was called before window is first 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()
|
self._iconify_called_before_window_exists = False # indicates if iconify() was called before window is first shown through update() or mainloop()
|
||||||
|
self._block_update_dimensions_event = False
|
||||||
|
|
||||||
|
# set CustomTkinter titlebar icon (Windows only)
|
||||||
|
if sys.platform.startswith("win"):
|
||||||
|
self.after(200, self._windows_set_titlebar_icon)
|
||||||
|
|
||||||
|
# set titlebar color (Windows only)
|
||||||
if sys.platform.startswith("win"):
|
if sys.platform.startswith("win"):
|
||||||
self._windows_set_titlebar_color(self._get_appearance_mode())
|
self._windows_set_titlebar_color(self._get_appearance_mode())
|
||||||
|
|
||||||
self.bind('<Configure>', self._update_dimensions_event)
|
self.bind('<Configure>', self._update_dimensions_event)
|
||||||
self.bind('<FocusIn>', self._focus_in_event)
|
self.bind('<FocusIn>', self._focus_in_event)
|
||||||
|
|
||||||
self._block_update_dimensions_event = False
|
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
self._disable_macos_dark_title_bar()
|
self._disable_macos_dark_title_bar()
|
||||||
|
|
||||||
@ -219,6 +216,19 @@ class CTk(tkinter.Tk, CTkAppearanceModeBaseClass, CTkScalingBaseClass):
|
|||||||
else:
|
else:
|
||||||
return super().cget(attribute_name)
|
return super().cget(attribute_name)
|
||||||
|
|
||||||
|
def wm_iconbitmap(self, bitmap=None, default=None):
|
||||||
|
self._iconbitmap_method_called = True
|
||||||
|
super().wm_iconbitmap(bitmap, default)
|
||||||
|
|
||||||
|
def _windows_set_titlebar_icon(self):
|
||||||
|
try:
|
||||||
|
# if not the user already called iconbitmap method, set icon
|
||||||
|
if not self._iconbitmap_method_called:
|
||||||
|
customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico"))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _enable_macos_dark_title_bar(cls):
|
def _enable_macos_dark_title_bar(cls):
|
||||||
if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS
|
if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS
|
||||||
|
@ -62,19 +62,25 @@ class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseCl
|
|||||||
# set title of tkinter.Toplevel
|
# set title of tkinter.Toplevel
|
||||||
super().title("CTkToplevel")
|
super().title("CTkToplevel")
|
||||||
|
|
||||||
|
# indicator variables
|
||||||
|
self._iconbitmap_method_called = True
|
||||||
self._state_before_windows_set_titlebar_color = None
|
self._state_before_windows_set_titlebar_color = None
|
||||||
self._windows_set_titlebar_color_called = False # indicates if windows_set_titlebar_color was called, stays True until revert_withdraw_after_windows_set_titlebar_color is called
|
self._windows_set_titlebar_color_called = False # indicates if windows_set_titlebar_color was called, stays True until revert_withdraw_after_windows_set_titlebar_color is called
|
||||||
self._withdraw_called_after_windows_set_titlebar_color = False # indicates if withdraw() was called after windows_set_titlebar_color
|
self._withdraw_called_after_windows_set_titlebar_color = False # indicates if withdraw() was called after windows_set_titlebar_color
|
||||||
self._iconify_called_after_windows_set_titlebar_color = False # indicates if iconify() was called after windows_set_titlebar_color
|
self._iconify_called_after_windows_set_titlebar_color = False # indicates if iconify() was called after windows_set_titlebar_color
|
||||||
|
self._block_update_dimensions_event = False
|
||||||
|
|
||||||
|
# set CustomTkinter titlebar icon (Windows only)
|
||||||
|
if sys.platform.startswith("win"):
|
||||||
|
self.after(200, self._windows_set_titlebar_icon)
|
||||||
|
|
||||||
|
# set titlebar color (Windows only)
|
||||||
if sys.platform.startswith("win"):
|
if sys.platform.startswith("win"):
|
||||||
self._windows_set_titlebar_color(self._get_appearance_mode())
|
self._windows_set_titlebar_color(self._get_appearance_mode())
|
||||||
|
|
||||||
self.bind('<Configure>', self._update_dimensions_event)
|
self.bind('<Configure>', self._update_dimensions_event)
|
||||||
self.bind('<FocusIn>', self._focus_in_event)
|
self.bind('<FocusIn>', self._focus_in_event)
|
||||||
|
|
||||||
self._block_update_dimensions_event = False
|
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
self._disable_macos_dark_title_bar()
|
self._disable_macos_dark_title_bar()
|
||||||
|
|
||||||
@ -190,6 +196,19 @@ class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseCl
|
|||||||
else:
|
else:
|
||||||
return super().cget(attribute_name)
|
return super().cget(attribute_name)
|
||||||
|
|
||||||
|
def wm_iconbitmap(self, bitmap=None, default=None):
|
||||||
|
self._iconbitmap_method_called = True
|
||||||
|
super().wm_iconbitmap(bitmap, default)
|
||||||
|
|
||||||
|
def _windows_set_titlebar_icon(self):
|
||||||
|
try:
|
||||||
|
# if not the user already called iconbitmap method, set icon
|
||||||
|
if not self._iconbitmap_method_called:
|
||||||
|
customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico"))
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _enable_macos_dark_title_bar(cls):
|
def _enable_macos_dark_title_bar(cls):
|
||||||
if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS
|
if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS
|
||||||
|
@ -85,6 +85,7 @@ class CTkRadioButton(CTkBaseClass):
|
|||||||
self.grid_columnconfigure(0, weight=0)
|
self.grid_columnconfigure(0, weight=0)
|
||||||
self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6))
|
self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6))
|
||||||
self.grid_columnconfigure(2, weight=1)
|
self.grid_columnconfigure(2, weight=1)
|
||||||
|
self.grid_rowconfigure(0, weight=1)
|
||||||
|
|
||||||
self._bg_canvas = CTkCanvas(master=self,
|
self._bg_canvas = CTkCanvas(master=self,
|
||||||
highlightthickness=0,
|
highlightthickness=0,
|
||||||
|
@ -92,6 +92,7 @@ class CTkSwitch(CTkBaseClass):
|
|||||||
self.grid_columnconfigure(0, weight=0)
|
self.grid_columnconfigure(0, weight=0)
|
||||||
self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6))
|
self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6))
|
||||||
self.grid_columnconfigure(2, weight=1)
|
self.grid_columnconfigure(2, weight=1)
|
||||||
|
self.grid_rowconfigure(0, weight=1)
|
||||||
|
|
||||||
self._bg_canvas = CTkCanvas(master=self,
|
self._bg_canvas = CTkCanvas(master=self,
|
||||||
highlightthickness=0,
|
highlightthickness=0,
|
||||||
@ -221,23 +222,29 @@ class CTkSwitch(CTkBaseClass):
|
|||||||
self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color))
|
self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color))
|
||||||
|
|
||||||
if self._border_color == "transparent":
|
if self._border_color == "transparent":
|
||||||
self._canvas.itemconfig("border_parts", fill=self._apply_appearance_mode(self._bg_color),
|
self._canvas.itemconfig("border_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._bg_color),
|
||||||
outline=self._apply_appearance_mode(self._bg_color))
|
outline=self._apply_appearance_mode(self._bg_color))
|
||||||
else:
|
else:
|
||||||
self._canvas.itemconfig("border_parts", fill=self._apply_appearance_mode(self._border_color),
|
self._canvas.itemconfig("border_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._border_color),
|
||||||
outline=self._apply_appearance_mode(self._border_color))
|
outline=self._apply_appearance_mode(self._border_color))
|
||||||
|
|
||||||
self._canvas.itemconfig("inner_parts", fill=self._apply_appearance_mode(self._fg_color),
|
self._canvas.itemconfig("inner_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._fg_color),
|
||||||
outline=self._apply_appearance_mode(self._fg_color))
|
outline=self._apply_appearance_mode(self._fg_color))
|
||||||
|
|
||||||
if self._progress_color == "transparent":
|
if self._progress_color == "transparent":
|
||||||
self._canvas.itemconfig("progress_parts", fill=self._apply_appearance_mode(self._fg_color),
|
self._canvas.itemconfig("progress_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._fg_color),
|
||||||
outline=self._apply_appearance_mode(self._fg_color))
|
outline=self._apply_appearance_mode(self._fg_color))
|
||||||
else:
|
else:
|
||||||
self._canvas.itemconfig("progress_parts", fill=self._apply_appearance_mode(self._progress_color),
|
self._canvas.itemconfig("progress_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._progress_color),
|
||||||
outline=self._apply_appearance_mode(self._progress_color))
|
outline=self._apply_appearance_mode(self._progress_color))
|
||||||
|
|
||||||
self._canvas.itemconfig("slider_parts", fill=self._apply_appearance_mode(self._button_color),
|
self._canvas.itemconfig("slider_parts",
|
||||||
|
fill=self._apply_appearance_mode(self._button_color),
|
||||||
outline=self._apply_appearance_mode(self._button_color))
|
outline=self._apply_appearance_mode(self._button_color))
|
||||||
|
|
||||||
if self._state == tkinter.DISABLED:
|
if self._state == tkinter.DISABLED:
|
||||||
|
Loading…
Reference in New Issue
Block a user