如何在tkinter的Entry中添加占位符?
背景
tkinter
是 Python 自带的 GUI 库,提供了开发桌面应用所需的各种组件。在制作表单时,我们常常需要在输入框中给出默认提示文字,即占位符(Placeholder)。然而,tkinter
自身没有提供此功能,本文将介绍如何给 Entry
中添加占位符。
实现方法
我们可以创建一个自定义的 Entry
组件,利用继承的方式在其中添加响应事件,以实现占位符功能。
首先,我们定义一个新类 PlaceholderEntry
,继承自 tkinter.Entry
:
import tkinter as tk
class PlaceholderEntry(tk.Entry):
然后,我们在类的初始化方法中添加两个变量,一个是默认提示文字,一个是默认文字颜色。我们要在 Entry
中添加时,只需要调用 addPlaceholder()
方法:
def __init__(self, master=None, placeholder="", color='black'):
super().__init__(master)
self.placeholder = placeholder
self.placeholder_color = color
self.default_fg_color = self['fg']
self.addPlaceholder()
在 addPlaceholder()
方法中,我们首先判断控件中是否有内容,如果没有则添加提示文字,否则,就把文字颜色变回原来的黑色:
def addPlaceholder(self):
self.insert(0, self.placeholder)
self['fg'] = self.placeholder_color
self.bind('<FocusIn>', self._clear_placeholder)
self.bind('<FocusOut>', self._add_placeholder)
当用户点击 Entry
框时,我们要清除提示文字,如果输入框为空则重新添加提示文字:
def _clear_placeholder(self, e):
if self['fg'] == self.placeholder_color:
self.delete('0', 'end')
self['fg'] = self.default_fg_color
def _add_placeholder(self, e):
if not self.get():
self.addPlaceholder()
这里,e
是 tkinter.Event
对象,记录了事件的相关信息,比如此处的 FocusIn
和 FocusOut
事件。
最终,我们的自定义 Entry
控件如下所示:
import tkinter as tk
class PlaceholderEntry(tk.Entry):
def __init__(self, master=None, placeholder="", color='black'):
super().__init__(master)
self.placeholder = placeholder
self.placeholder_color = color
self.default_fg_color = self['fg']
self.addPlaceholder()
def addPlaceholder(self):
self.insert(0, self.placeholder)
self['fg'] = self.placeholder_color
self.bind('<FocusIn>', self._clear_placeholder)
self.bind('<FocusOut>', self._add_placeholder)
def _clear_placeholder(self, e):
if self['fg'] == self.placeholder_color:
self.delete('0', 'end')
self['fg'] = self.default_fg_color
def _add_placeholder(self, e):
if not self.get():
self.addPlaceholder()
示例代码
我们现在可以使用 PlaceholderEntry
控件,在其中,以 placeholder
参数的形式传入占位符,以 color
参数的形式传入占位符文字颜色。示例如下:
import tkinter as tk
from PlaceholderEntry import PlaceholderEntry
def main():
root = tk.Tk()
root.title("PlaceholderEntry Demo")
# 添加占位符
entry1 = PlaceholderEntry(root, "请输入姓名", color="grey")
entry1.pack(fill='both', padx=10, pady=10)
entry2 = PlaceholderEntry(root, "请输入密码", color="grey")
entry2.pack(fill='x', padx=10, pady=10)
root.mainloop()
if __name__ == '__main__':
main()
需要注意的是,我们需要在文件夹中创建一个 __init__.py
的空文件,才能够导入自定义控件。
结论
如上所述,我们在 tkinter
中使用继承的方式创建新的控件 PlaceholderEntry
,并在其内部实现占位符功能,通过传入 placeholder
和color
参数来控制占位符的显示效果。这种方式可以方便地在表单中添加占位符,提高输入体验和提示用户。
完整示例代码可在 GitHub 上查看:https://github.com/Lucius-H/placeholder-entry-tkinter。