mirror of
https://github.com/TomSchimansky/CustomTkinter.git
synced 2023-08-10 21:13:13 +03:00
added placeholder text to CTkEntry
This commit is contained in:
parent
f5cac7b978
commit
5f9c30aeaf
@ -1,4 +1,4 @@
|
||||
__version__ = "2.0"
|
||||
__version__ = "2.1"
|
||||
|
||||
from .customtkinter_button import CTkButton
|
||||
from .customtkinter_slider import CTkSlider
|
||||
|
@ -8,6 +8,7 @@ class CTkColorManager:
|
||||
MAIN_HOVER = None
|
||||
ENTRY = None
|
||||
TEXT = None
|
||||
PLACEHOLDER_TEXT = None
|
||||
LABEL_BG = None
|
||||
SLIDER_BG = None
|
||||
SLIDER_PROGRESS = None
|
||||
@ -26,6 +27,7 @@ class CTkColorManager:
|
||||
cls.MAIN_HOVER = ("#5FB4DD", "#5FB4DD")
|
||||
cls.ENTRY = ("white", "#222222")
|
||||
cls.TEXT = ("black", "white")
|
||||
cls.PLACEHOLDER_TEXT = ("gray52", "gray62")
|
||||
cls.LABEL_BG = ("white", "#626061")
|
||||
cls.SLIDER_BG = ("#6B6B6B", "#222222")
|
||||
cls.SLIDER_PROGRESS = ("#A5A6A5", "#555555")
|
||||
|
@ -13,7 +13,9 @@ class CTkEntry(tkinter.Frame):
|
||||
bg_color=None,
|
||||
fg_color="CTkColorManager",
|
||||
text_color="CTkColorManager",
|
||||
placeholder_text_color="CTkColorManager",
|
||||
text_font=None,
|
||||
placeholder_text=None,
|
||||
corner_radius=8,
|
||||
width=120,
|
||||
height=30,
|
||||
@ -52,6 +54,7 @@ class CTkEntry(tkinter.Frame):
|
||||
self.bg_color = self.detect_color_of_master() if bg_color is None else bg_color
|
||||
self.fg_color = CTkColorManager.ENTRY if fg_color == "CTkColorManager" else fg_color
|
||||
self.text_color = CTkColorManager.TEXT if text_color == "CTkColorManager" else text_color
|
||||
self.placeholder_text_color = CTkColorManager.PLACEHOLDER_TEXT if placeholder_text_color == "CTkColorManager" else placeholder_text_color
|
||||
|
||||
if text_font is None:
|
||||
if sys.platform == "darwin": # macOS
|
||||
@ -63,9 +66,12 @@ class CTkEntry(tkinter.Frame):
|
||||
else:
|
||||
self.text_font = text_font
|
||||
|
||||
self.placeholder_text = placeholder_text
|
||||
self.placeholder_text_active = False
|
||||
self.pre_placeholder_arguments = {} # some set arguments of the entry will be changed for placeholder and then set back
|
||||
|
||||
self.width = width
|
||||
self.height = height
|
||||
|
||||
self.corner_radius = self.calc_optimal_corner_radius(corner_radius) # optimise for less artifacts
|
||||
|
||||
if self.corner_radius*2 > self.height:
|
||||
@ -91,8 +97,12 @@ class CTkEntry(tkinter.Frame):
|
||||
|
||||
self.fg_parts = []
|
||||
|
||||
self.bind('<Configure>', self.update_dimensions)
|
||||
super().bind('<Configure>', self.update_dimensions)
|
||||
self.entry.bind('<FocusOut>', self.set_placeholder)
|
||||
self.entry.bind('<FocusIn>', self.clear_placeholder)
|
||||
|
||||
self.draw()
|
||||
self.set_placeholder()
|
||||
|
||||
def destroy(self):
|
||||
AppearanceModeTracker.remove(self.change_appearance_mode)
|
||||
@ -132,6 +142,23 @@ class CTkEntry(tkinter.Frame):
|
||||
|
||||
self.draw()
|
||||
|
||||
def set_placeholder(self, event=None):
|
||||
if self.placeholder_text is not None:
|
||||
if not self.placeholder_text_active and self.entry.get() == "":
|
||||
self.placeholder_text_active = True
|
||||
self.pre_placeholder_arguments = {"show": self.entry.cget("show")}
|
||||
self.entry.config(fg=CTkColorManager.single_color(self.placeholder_text_color, self.appearance_mode), show="")
|
||||
self.entry.delete(0, tkinter.END)
|
||||
self.entry.insert(0, self.placeholder_text)
|
||||
|
||||
def clear_placeholder(self, event=None):
|
||||
if self.placeholder_text_active:
|
||||
self.placeholder_text_active = False
|
||||
self.entry.config(fg=CTkColorManager.single_color(self.text_color, self.appearance_mode))
|
||||
self.entry.delete(0, tkinter.END)
|
||||
for argument, value in self.pre_placeholder_arguments.items():
|
||||
self.entry[argument] = value
|
||||
|
||||
def draw(self):
|
||||
self.canvas.delete("all")
|
||||
self.fg_parts = []
|
||||
@ -189,6 +216,9 @@ class CTkEntry(tkinter.Frame):
|
||||
self.entry.configure(fg=self.text_color,
|
||||
insertbackground=self.text_color)
|
||||
|
||||
def bind(self, *args, **kwargs):
|
||||
self.entry.bind(*args, **kwargs)
|
||||
|
||||
def config(self, *args, **kwargs):
|
||||
self.configure(*args, **kwargs)
|
||||
|
||||
@ -228,13 +258,19 @@ class CTkEntry(tkinter.Frame):
|
||||
self.draw()
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
return self.entry.delete(*args, **kwargs)
|
||||
self.entry.delete(*args, **kwargs)
|
||||
self.set_placeholder()
|
||||
return
|
||||
|
||||
def insert(self, *args, **kwargs):
|
||||
self.clear_placeholder()
|
||||
return self.entry.insert(*args, **kwargs)
|
||||
|
||||
def get(self):
|
||||
return self.entry.get()
|
||||
if self.placeholder_text_active:
|
||||
return ""
|
||||
else:
|
||||
return self.entry.get()
|
||||
|
||||
def change_appearance_mode(self, mode_string):
|
||||
if mode_string.lower() == "dark":
|
||||
|
@ -46,13 +46,11 @@ class App(customtkinter.CTk):
|
||||
fg_color=("gray70", "gray20"), text="CustomTkinter\ninterface example")
|
||||
self.label_1.place(relx=0.5, rely=0.3, anchor=tkinter.CENTER)
|
||||
|
||||
self.entry_1 = customtkinter.CTkEntry(master=self.frame, corner_radius=20, width=200)
|
||||
self.entry_1 = customtkinter.CTkEntry(master=self.frame, corner_radius=20, width=200, placeholder_text="username")
|
||||
self.entry_1.place(relx=0.5, rely=0.52, anchor=tkinter.CENTER)
|
||||
self.entry_1.insert(0, "username")
|
||||
|
||||
self.entry_2 = customtkinter.CTkEntry(master=self.frame, corner_radius=20, width=200, show="*")
|
||||
self.entry_2 = customtkinter.CTkEntry(master=self.frame, corner_radius=20, width=200, show="*", placeholder_text="password")
|
||||
self.entry_2.place(relx=0.5, rely=0.6, anchor=tkinter.CENTER)
|
||||
self.entry_2.insert(0, "password")
|
||||
|
||||
self.button_2 = customtkinter.CTkButton(master=self.frame, text="Login",
|
||||
corner_radius=6, command=self.button_event, width=200)
|
||||
|
@ -10,7 +10,7 @@ root_tk.title("CustomTkinter Test")
|
||||
|
||||
|
||||
def button_function():
|
||||
print("Button click")
|
||||
print("Button click", label_1.text_label.cget("text"))
|
||||
|
||||
|
||||
def slider_function(value):
|
||||
@ -40,7 +40,7 @@ slider_1 = customtkinter.CTkSlider(master=frame_1, command=slider_function, from
|
||||
slider_1.pack(pady=y_padding, padx=10)
|
||||
slider_1.set(0.5)
|
||||
|
||||
entry_1 = customtkinter.CTkEntry(master=frame_1)
|
||||
entry_1 = customtkinter.CTkEntry(master=frame_1, placeholder_text="CTkEntry")
|
||||
entry_1.pack(pady=y_padding, padx=10)
|
||||
|
||||
checkbox_1 = customtkinter.CTkCheckBox(master=frame_1, command=check_box_function)
|
||||
|
Loading…
x
Reference in New Issue
Block a user