gpt4 book ai didi

python - 以程序方式将占位符添加到 tkinter Entry 小部件

转载 作者:行者123 更新时间:2023-12-05 09:08:16 25 4
gpt4 key购买 nike

我知道这个问题已经在这个网站上得到了回答,但我正在寻找一个更简单的答案,我以前见过一个,但后来这个问题被删除了或者什么的,我找不到它了。希望有人有更好更简单的方法来解决它。与类相关的东西可能会更好,因为我可以轻松地将它与更多 Entry 小部件一起使用

这是一个片段:

from tkinter import *

root = Tk()

def remove(event):
e.delete(0, END)

e = Entry(root)
e.insert(0, 'PLACEHOLDER')
e.pack(padx=100,pady=(30,0))
e.bind('<FocusIn>', remove)

e2 = Entry(root)
e2.pack( pady=(20,100))

root.mainloop()

是的,一旦它失去焦点并再次获得焦点,这将删除框中的所有其他项目,包括我们首先输入的文本。无论如何要解决这个问题并使用 tkinter 拥有一个完美的占位符,我知道没有内置的方法。

提前致谢:D

最佳答案

我不太清楚你在问什么,所以我猜你是在问如何知道条目小部件何时有占位符文本,何时没有,以便你知道何时清除它和什么时候不清除它。

最简单的解决方案是用替换文本向条目添加一个属性,然后在删除之前将其与内容进行比较。

使用函数

首先,让我们创建一个函数来初始化小部件的占位符文本。这个函数做了一些简单的事情:它在小部件上添加了一个 placeholder 属性,并建立了绑定(bind)。如果小部件为空,它还会插入占位符:

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.widgetplaceholder 属性:

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()

关于python - 以程序方式将占位符添加到 tkinter Entry 小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63651586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com