如何在tkinter的Entry中添加占位符?

如何在tkinter的Entry中添加占位符?

背景

tkinterPython 自带的 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()

这里,etkinter.Event 对象,记录了事件的相关信息,比如此处的 FocusInFocusOut 事件。

最终,我们的自定义 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,并在其内部实现占位符功能,通过传入 placeholdercolor 参数来控制占位符的显示效果。这种方式可以方便地在表单中添加占位符,提高输入体验和提示用户。

完整示例代码可在 GitHub 上查看:https://github.com/Lucius-H/placeholder-entry-tkinter

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程