我不太清楚你在问什么,所以我猜你在问如何知道条目小部件何时具有占位符文本以及何时没有,以便您知道何时清除它以及什么时候不清除。
最简单的解决方法是在条目中添加一个带有替换文本的属性,然后将其与删除前的内容进行比较。
使用函数
首先,让我们创建一个函数来初始化小部件的占位符文本。这个函数做了一些简单的事情:它在小部件上添加了一个placeholder 属性,并建立了绑定。如果小部件为空,它还会插入占位符:
def init_placeholder(widget, placeholder_text):
widget.placeholder = placeholder_text
if widget.get() == "":
widget.insert("end", placeholder_text)
# set up a binding to remove placeholder text
widget.bind("<FocusIn>", remove_placeholder)
widget.bind("<FocusOut>", add_placeholder)
现在让我们调整您的 remove 函数,使其更加通用。由于它是通过事件调用的,因此它可以使用event.widget 而不是对特定小部件的硬编码引用。它还使用我们添加到小部件的placeholder 属性。这两种技术可以让它被多个小部件使用。
def remove_placeholder(event):
placeholder_text = getattr(event.widget, "placeholder", "")
if placeholder_text and event.widget.get() == placeholder_text:
event.widget.delete(0, "end")
最后我们需要实现add_placeholder函数。当小部件失去焦点并且用户没有输入任何内容时,此函数将添加占位符。它需要检查入口小部件是否有占位符,如果有并且小部件为空,则添加占位符。与remove_placeholder 一样,它使用event.widget 和placeholder 属性:
def add_placeholder(event):
placeholder_text = getattr(event.widget, "placeholder", "")
if placeholder_text and event.widget.get() == "":
event.widget.insert(0, placeholder_text)
我已经修改了您的程序,为两个条目小部件中的每一个使用不同的占位符文本,以表明这些功能是通用的,并且不依赖于特定的条目小部件。
from tkinter import *
root = Tk()
def remove_placeholder(event):
"""Remove placeholder text, if present"""
placeholder_text = getattr(event.widget, "placeholder", "")
if placeholder_text and event.widget.get() == placeholder_text:
event.widget.delete(0, "end")
def add_placeholder(event):
"""Add placeholder text if the widget is empty"""
placeholder_text = getattr(event.widget, "placeholder", "")
if placeholder_text and event.widget.get() == "":
event.widget.insert(0, placeholder_text)
def init_placeholder(widget, placeholder_text):
widget.placeholder = placeholder_text
if widget.get() == "":
widget.insert("end", placeholder_text)
# set up a binding to remove placeholder text
widget.bind("<FocusIn>", remove_placeholder)
widget.bind("<FocusOut>", add_placeholder)
e = Entry(root)
e.pack(padx=100,pady=(30,0))
e2 = Entry(root)
e2.pack( pady=(20,100))
init_placeholder(e, "First Name")
init_placeholder(e2, "Last Name")
root.mainloop()
使用自定义类
可以说,实现这一点的更好方法是创建一个自定义类。这样,所有内容都封装在一个地方。这是一个例子:
class EntryWithPlaceholder(Entry):
def __init__(self, *args, **kwargs):
self.placeholder = kwargs.pop("placeholder", "")
super().__init__(*args, **kwargs)
self.insert("end", self.placeholder)
self.bind("<FocusIn>", self.remove_placeholder)
self.bind("<FocusOut>", self.add_placeholder)
def remove_placeholder(self, event):
"""Remove placeholder text, if present"""
if self.get() == self.placeholder:
self.delete(0, "end")
def add_placeholder(self,event):
"""Add placeholder text if the widget is empty"""
if self.placeholder and self.get() == "":
self.insert(0, self.placeholder)
您可以像使用 Entry 小部件一样使用此类,但您可以指定占位符:
e3 = EntryWithPlaceholder(root, placeholder="Address")
e3.pack()