用户输入相同的占位符文本 python tkinter
User entering same placeholder text python tkinter
我为 tkinter 制作了一个占位符,并想继续推进它,但是如果用户输入与占位符相同的文本,占位符应该发生的所有效果都会在文本上实现。无论如何要克服这个?
占位符:
import tkinter as tk
from tkinter import ttk
class PlaceholderEntry(tk.Entry):
'''
Custom modern Placeholder Entry box, takes positional argument master and placeholder\n
Use ret() for getting output from entry widget\n
Use ins() for inserting into entry widget\n
Use remove() for deleting from entry widget\n
ISSUES: What if the user types exactly same text as the placeholders in the entrybox?
'''
def __init__(self, master, placeholder, **kwargs):
# style for ttk widget
self.s = ttk.Style()
self.s.configure('my.TEntry')
# init entry box
ttk.Entry.__init__(self, master, style='my.TEntry', **kwargs)
self.text = placeholder
# add placeholder if box empty
self.add()
# bindings of the widget
self.bind('<FocusIn>', self.clear)
self.bind('<FocusOut>', self.add)
self.bind_all('<Key>', self.normal)
self.bind_all('<Button-1>', self.cursor)
def clear(self, *args):
if self.get() == self.text: # remove placeholder when focus gain
self.delete(0, tk.END)
self.s.configure('my.TEntry', foreground='black',
font=(0, 0, 'normal'))
def add(self, *args):
if self.get() == '': # if no text add placeholder
self.s.configure('my.TEntry', foreground='grey',
font=(0, 0, 'bold'))
self.insert(0, self.text) # insert placeholder
self.icursor(0) # move insertion cursor to start of entrybox
def normal(self, *args):
self.s.configure('my.TEntry', foreground='black',
font=(0, 0, 'normal')) # set normal font
self.add() # if empty add placeholder
if self.get() == self.text: # clear the placeholder if starts typing
self.bind('<Key>', self.clear)
self.icursor(-1) # keep insertion cursor to the end
def ret(self): # custom method to get the text
if self.get() == self.text:
return None
else:
return self.get()
def ins(self, index, string): # custom method to insert into entry
self.clear()
self.insert(index, string)
def remove(self, first, last): # custom method to remove from entry
if self.get() != self.text:
self.delete(first, last)
self.add()
def cursor(self, *args): # method to not allow user to move cursor when placeholder there
if self.get() == self.text:
self.icursor(0)
if __name__ == '__main__':
root = tk.Tk()
plc = PlaceholderEntry(root,placeholder='Type')
plc.pack(padx=10,pady=10)
root.mainloop()
您可以通过在框中键入类型来重现该问题,它会删除进一步的插入,因为它会将条目误认为是占位符。
提前致谢:D
有点老套的解决方案,但为什么不在占位符文本的开头添加 space(或 non-printable 字符)
plc = PlaceholderEntry(root,placeholder=' Type')
或
self.text = "\x00" + placeholder
这将确保用户输入的文本不会与占位符文本匹配
因为您有一个自定义 class,所以在添加占位符文本时很容易设置标志,在删除占位符时也很容易取消设置。那就只需要在获取值时检查是否设置了标志即可。
def add(self, *args):
if self.get() == '': # if no text add placeholder
...
self._has_placeholder = True
def clear(self, *args):
if self.get() == self.text: # remove placeholder when focus gain
self._has_placeholder = False
...
我为 tkinter 制作了一个占位符,并想继续推进它,但是如果用户输入与占位符相同的文本,占位符应该发生的所有效果都会在文本上实现。无论如何要克服这个?
占位符:
import tkinter as tk
from tkinter import ttk
class PlaceholderEntry(tk.Entry):
'''
Custom modern Placeholder Entry box, takes positional argument master and placeholder\n
Use ret() for getting output from entry widget\n
Use ins() for inserting into entry widget\n
Use remove() for deleting from entry widget\n
ISSUES: What if the user types exactly same text as the placeholders in the entrybox?
'''
def __init__(self, master, placeholder, **kwargs):
# style for ttk widget
self.s = ttk.Style()
self.s.configure('my.TEntry')
# init entry box
ttk.Entry.__init__(self, master, style='my.TEntry', **kwargs)
self.text = placeholder
# add placeholder if box empty
self.add()
# bindings of the widget
self.bind('<FocusIn>', self.clear)
self.bind('<FocusOut>', self.add)
self.bind_all('<Key>', self.normal)
self.bind_all('<Button-1>', self.cursor)
def clear(self, *args):
if self.get() == self.text: # remove placeholder when focus gain
self.delete(0, tk.END)
self.s.configure('my.TEntry', foreground='black',
font=(0, 0, 'normal'))
def add(self, *args):
if self.get() == '': # if no text add placeholder
self.s.configure('my.TEntry', foreground='grey',
font=(0, 0, 'bold'))
self.insert(0, self.text) # insert placeholder
self.icursor(0) # move insertion cursor to start of entrybox
def normal(self, *args):
self.s.configure('my.TEntry', foreground='black',
font=(0, 0, 'normal')) # set normal font
self.add() # if empty add placeholder
if self.get() == self.text: # clear the placeholder if starts typing
self.bind('<Key>', self.clear)
self.icursor(-1) # keep insertion cursor to the end
def ret(self): # custom method to get the text
if self.get() == self.text:
return None
else:
return self.get()
def ins(self, index, string): # custom method to insert into entry
self.clear()
self.insert(index, string)
def remove(self, first, last): # custom method to remove from entry
if self.get() != self.text:
self.delete(first, last)
self.add()
def cursor(self, *args): # method to not allow user to move cursor when placeholder there
if self.get() == self.text:
self.icursor(0)
if __name__ == '__main__':
root = tk.Tk()
plc = PlaceholderEntry(root,placeholder='Type')
plc.pack(padx=10,pady=10)
root.mainloop()
您可以通过在框中键入类型来重现该问题,它会删除进一步的插入,因为它会将条目误认为是占位符。
提前致谢:D
有点老套的解决方案,但为什么不在占位符文本的开头添加 space(或 non-printable 字符)
plc = PlaceholderEntry(root,placeholder=' Type')
或
self.text = "\x00" + placeholder
这将确保用户输入的文本不会与占位符文本匹配
因为您有一个自定义 class,所以在添加占位符文本时很容易设置标志,在删除占位符时也很容易取消设置。那就只需要在获取值时检查是否设置了标志即可。
def add(self, *args):
if self.get() == '': # if no text add placeholder
...
self._has_placeholder = True
def clear(self, *args):
if self.get() == self.text: # remove placeholder when focus gain
self._has_placeholder = False
...