mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
ComboBox and DropDown fixes for Windows
This commit is contained in:
parent
550653c6c3
commit
807064a888
@ -113,10 +113,6 @@ class CTkComboBox(CTkBaseClass):
|
|||||||
if self.variable is not None:
|
if self.variable is not None:
|
||||||
self.entry.configure(textvariable=self.variable)
|
self.entry.configure(textvariable=self.variable)
|
||||||
|
|
||||||
# if self.variable is not None:
|
|
||||||
# self.variable_callback_name = self.variable.trace_add("write", self.variable_callback)
|
|
||||||
# self.set(self.variable.get(), from_variable_callback=True)
|
|
||||||
|
|
||||||
def set_scaling(self, *args, **kwargs):
|
def set_scaling(self, *args, **kwargs):
|
||||||
super().set_scaling(*args, **kwargs)
|
super().set_scaling(*args, **kwargs)
|
||||||
|
|
||||||
@ -169,8 +165,12 @@ class CTkComboBox(CTkBaseClass):
|
|||||||
|
|
||||||
if self.state == tkinter.DISABLED:
|
if self.state == tkinter.DISABLED:
|
||||||
self.entry.configure(fg=(ThemeManager.single_color(self.text_color_disabled, self._appearance_mode)))
|
self.entry.configure(fg=(ThemeManager.single_color(self.text_color_disabled, self._appearance_mode)))
|
||||||
|
self.canvas.itemconfig("dropdown_arrow",
|
||||||
|
fill=ThemeManager.single_color(self.text_color_disabled, self._appearance_mode))
|
||||||
else:
|
else:
|
||||||
self.entry.configure(fg=ThemeManager.single_color(self.text_color, self._appearance_mode))
|
self.entry.configure(fg=ThemeManager.single_color(self.text_color, self._appearance_mode))
|
||||||
|
self.canvas.itemconfig("dropdown_arrow",
|
||||||
|
fill=ThemeManager.single_color(self.text_color, self._appearance_mode))
|
||||||
|
|
||||||
def open_dropdown_menu(self):
|
def open_dropdown_menu(self):
|
||||||
self.dropdown_menu = DropdownMenu(x_position=self.winfo_rootx(),
|
self.dropdown_menu = DropdownMenu(x_position=self.winfo_rootx(),
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import customtkinter
|
import customtkinter
|
||||||
import tkinter
|
import tkinter
|
||||||
import sys
|
import sys
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
from ..theme_manager import ThemeManager
|
from ..theme_manager import ThemeManager
|
||||||
from ..appearance_mode_tracker import AppearanceModeTracker
|
from ..appearance_mode_tracker import AppearanceModeTracker
|
||||||
@ -27,7 +28,8 @@ class DropdownMenu(tkinter.Toplevel):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
ScalingTracker.add_widget(self.set_scaling, self)
|
ScalingTracker.add_widget(self.set_scaling, self)
|
||||||
self.widget_scaling = ScalingTracker.get_widget_scaling(self)
|
self._widget_scaling = ScalingTracker.get_widget_scaling(self)
|
||||||
|
self._spacing_scaling = ScalingTracker.get_spacing_scaling(self)
|
||||||
|
|
||||||
self.values = values
|
self.values = values
|
||||||
self.command = command
|
self.command = command
|
||||||
@ -44,12 +46,13 @@ class DropdownMenu(tkinter.Toplevel):
|
|||||||
self.button_corner_radius = button_corner_radius
|
self.button_corner_radius = button_corner_radius
|
||||||
self.button_height = button_height
|
self.button_height = button_height
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = max(len(self.values), 1) * (self.button_height + y_spacing) + y_spacing
|
self.height = max(len(self.values), 1) * (self.button_height + self.apply_spacing_scaling(y_spacing)) + self.apply_spacing_scaling(y_spacing)
|
||||||
|
|
||||||
self.geometry(f"{round(self.apply_widget_scaling(self.width))}x" +
|
self.geometry(f"{round(self.apply_widget_scaling(self.width))}x" +
|
||||||
f"{round(self.apply_widget_scaling(self.height))}+" +
|
f"{round(self.apply_widget_scaling(self.height))}+" +
|
||||||
f"{round(x_position)}+{round(y_position)}")
|
f"{round(x_position)}+{round(y_position)}")
|
||||||
self.grid_columnconfigure(0, weight=1)
|
self.grid_columnconfigure(0, weight=1)
|
||||||
|
self.grid_rowconfigure(0, weight=1)
|
||||||
|
|
||||||
if sys.platform.startswith("darwin"):
|
if sys.platform.startswith("darwin"):
|
||||||
self.overrideredirect(True) # remove title-bar
|
self.overrideredirect(True) # remove title-bar
|
||||||
@ -82,8 +85,8 @@ class DropdownMenu(tkinter.Toplevel):
|
|||||||
corner_radius=self.corner_radius,
|
corner_radius=self.corner_radius,
|
||||||
fg_color=self.fg_color, overwrite_preferred_drawing_method="circle_shapes")
|
fg_color=self.fg_color, overwrite_preferred_drawing_method="circle_shapes")
|
||||||
|
|
||||||
self.frame.grid(row=0, column=0, sticky="nsew", rowspan=len(self.values) + 1)
|
self.frame.grid(row=0, column=0, sticky="nsew", rowspan=1)
|
||||||
self.frame.grid_rowconfigure(len(self.values) + 1, minsize=y_spacing) # add spacing at the bottom
|
self.frame.grid_rowconfigure(len(self.values) + 1, minsize=self.apply_spacing_scaling(y_spacing)) # add spacing at the bottom
|
||||||
self.frame.grid_columnconfigure(0, weight=1)
|
self.frame.grid_columnconfigure(0, weight=1)
|
||||||
|
|
||||||
self.button_list = []
|
self.button_list = []
|
||||||
@ -91,7 +94,7 @@ class DropdownMenu(tkinter.Toplevel):
|
|||||||
button = customtkinter.CTkButton(self.frame,
|
button = customtkinter.CTkButton(self.frame,
|
||||||
text=option,
|
text=option,
|
||||||
height=self.button_height,
|
height=self.button_height,
|
||||||
width=self.width - 2 * x_spacing,
|
width=self.width - 2 * self.apply_widget_scaling(x_spacing),
|
||||||
fg_color=self.button_color,
|
fg_color=self.button_color,
|
||||||
text_color=self.text_color,
|
text_color=self.text_color,
|
||||||
hover_color=self.button_hover_color,
|
hover_color=self.button_hover_color,
|
||||||
@ -100,16 +103,22 @@ class DropdownMenu(tkinter.Toplevel):
|
|||||||
button.text_label.configure(anchor="w")
|
button.text_label.configure(anchor="w")
|
||||||
button.text_label.grid(row=0, column=0, rowspan=2, columnspan=2, sticky="w")
|
button.text_label.grid(row=0, column=0, rowspan=2, columnspan=2, sticky="w")
|
||||||
button.grid(row=index, column=0,
|
button.grid(row=index, column=0,
|
||||||
padx=x_spacing,
|
padx=self.apply_widget_scaling(x_spacing),
|
||||||
pady=(y_spacing, 0), sticky="ew")
|
pady=(self.apply_widget_scaling(y_spacing), 0), sticky="ew")
|
||||||
self.button_list.append(button)
|
self.button_list.append(button)
|
||||||
|
|
||||||
self.bind("<FocusOut>", self.focus_loss_event)
|
self.bind("<FocusOut>", self.focus_loss_event)
|
||||||
self.frame.canvas.bind("<Button-1>", self.focus_loss_event)
|
self.frame.canvas.bind("<Button-1>", self.focus_loss_event)
|
||||||
|
|
||||||
def apply_widget_scaling(self, value):
|
def apply_widget_scaling(self, value: Union[int, float, str]) -> Union[float, str]:
|
||||||
if isinstance(value, (int, float)):
|
if isinstance(value, (int, float)):
|
||||||
return value * self.widget_scaling
|
return value * self._widget_scaling
|
||||||
|
else:
|
||||||
|
return value
|
||||||
|
|
||||||
|
def apply_spacing_scaling(self, value: Union[int, float, str]) -> Union[float, str]:
|
||||||
|
if isinstance(value, (int, float)):
|
||||||
|
return value * self._spacing_scaling
|
||||||
else:
|
else:
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
@ -36,13 +36,11 @@ slider_1.set(0.5)
|
|||||||
entry_1 = customtkinter.CTkEntry(master=frame_1, placeholder_text="CTkEntry")
|
entry_1 = customtkinter.CTkEntry(master=frame_1, placeholder_text="CTkEntry")
|
||||||
entry_1.pack(pady=12, padx=10)
|
entry_1.pack(pady=12, padx=10)
|
||||||
|
|
||||||
s = customtkinter.StringVar(value="test")
|
optionmenu_1 = customtkinter.CTkOptionMenu(frame_1, values=["Option 1", "Option 2", "Option 42"])
|
||||||
|
|
||||||
optionmenu_1 = customtkinter.CTkOptionMenu(frame_1, values=["Option 1", "Option 2", "Option 42"], variable=s)
|
|
||||||
optionmenu_1.pack(pady=12, padx=10)
|
optionmenu_1.pack(pady=12, padx=10)
|
||||||
optionmenu_1.set("CTkOptionMenu")
|
optionmenu_1.set("CTkOptionMenu")
|
||||||
|
|
||||||
combobox_1 = customtkinter.CTkComboBox(frame_1, values=["Option 1", "Option 2", "Option 42"], variable=s)
|
combobox_1 = customtkinter.CTkComboBox(frame_1, values=["Option 1", "Option 2", "Option 42"])
|
||||||
combobox_1.pack(pady=12, padx=10)
|
combobox_1.pack(pady=12, padx=10)
|
||||||
optionmenu_1.set("CTkComboBox")
|
optionmenu_1.set("CTkComboBox")
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ app.title("Tkinter Variable Test")
|
|||||||
txt_var = tkinter.StringVar(value="")
|
txt_var = tkinter.StringVar(value="")
|
||||||
entry_1 = customtkinter.CTkEntry(app, width=200, textvariable=txt_var)
|
entry_1 = customtkinter.CTkEntry(app, width=200, textvariable=txt_var)
|
||||||
entry_1.pack(pady=15)
|
entry_1.pack(pady=15)
|
||||||
txt_var.set("new text wjkfjdshkjfb")
|
txt_var.set("new text test")
|
||||||
if TEST_CONFIGURE: entry_1.configure(textvariable=txt_var)
|
if TEST_CONFIGURE: entry_1.configure(textvariable=txt_var)
|
||||||
if TEST_REMOVING: entry_1.configure(textvariable="")
|
if TEST_REMOVING: entry_1.configure(textvariable="")
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user