如何在tkinter条目小部件中插入临时文本?

2024-03-28 08:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在tkinterEntry小部件中插入临时文本?

例如,我有一个标签User,旁边有一个Entry小部件,它应该在应用程序的开头有一些文本"Enter your username...",当将光标放在Entry小部件上时,它应该删除"Enter your username...",并允许用户输入数据。

这是我当前的代码:

import tkinter as tk

root = tk.Tk()

label = tk.Label(root, text="User:")
label.pack()
entry = tk.Entry(root, bd=1, show="Enter your user name...")
entry.pack()

root.mainloop()

我该怎么做?

我没有找到任何选项或方法来删除将光标放在Entry小部件上的数据。


Tags: 数据文本your部件usernamerootlabelpack
3条回答

我想补充一些尚未回答的问题。正如9jera所说,只有当Entry小部件看到默认文本,而不是Leo Tenenbaum使用的“firstclick”方法时,我们才能使其清除。

如果用户在不输入任何内容的情况下将焦点转到另一个小部件,我们还可以添加第二个函数来填充Entry小部件。

这可以通过以下方式实现:

import Tkinter as tk


def on_entry_click(event):
    """function that gets called whenever entry is clicked"""
    if entry.get() == 'Enter your user name...':
       entry.delete(0, "end") # delete all the text in the entry
       entry.insert(0, '') #Insert blank for user input
       entry.config(fg = 'black')
def on_focusout(event):
    if entry.get() == '':
        entry.insert(0, 'Enter your username...')
        entry.config(fg = 'grey')


root = tk.Tk()

label = tk.Label(root, text="User: ")
label.pack(side="left")

entry = tk.Entry(root, bd=1)
entry.insert(0, 'Enter your user name...')
entry.bind('<FocusIn>', on_entry_click)
entry.bind('<FocusOut>', on_focusout)
entry.config(fg = 'grey')
entry.pack(side="left")

root.mainloop()

最后,我还为默认文本添加了灰色,为用户编写的文本添加了黑色,这是为那些对此感到疑惑的人准备的。我在这里看到的唯一问题是,如果用户实际在其中手动键入Enter your user name...,并将焦点放在外面和里面,那么即使文本是由用户自己编写的,也将被删除。我想到的一个解决方案是更改if语句,以便在删除任何内容之前获得颜色而不是默认文本。如果颜色是灰色,可以继续删除。否则,就不会了。但是,我还没有找到一种方法来获得文本颜色。如果有人知道,请告诉我!

编辑:显然,正如Olivier Samson所指出的,使用entry.cget('fg')可以获得条目的颜色。我想,两年后,我终于想出了怎么做。

因此,我们现在可以将线if entry.get() == 'Enter your user name...':更改为if entry.cget('fg') == 'grey':。这样,每当第一次单击条目并在其中键入任何内容时,颜色将更改为黑色,因此下次用户聚焦时,它不会删除任何文本(即使该文本是Enter your user name...)。

我认为这应该管用:

import Tkinter as tk


firstclick = True

def on_entry_click(event):
    """function that gets called whenever entry1 is clicked"""        
    global firstclick

    if firstclick: # if this is the first time they clicked it
        firstclick = False
        entry.delete(0, "end") # delete all the text in the entry


root = tk.Tk()

label = tk.Label(root, text="User: ")
label.pack(side="left")

entry = tk.Entry(root, bd=1)
entry.insert(0, 'Enter your user name...')
entry.bind('<FocusIn>', on_entry_click)
entry.pack(side="left")

root.mainloop()

当用户单击条目entry时,这将删除Enter your user name...

从Leo的代码entry1.delete应该改为entry.delete

此外,他的代码中的Entry小部件只在第一次单击时清除,但是只有当Entry小部件设置为默认文本时,才能使其清除。如果您的代码必须重复自身,这可能会有帮助。

试试这个:

import Tkinter as tk


def on_entry_click(event):
    """function that gets called whenever entry is clicked"""
    if entry.get() == 'Enter your user name...':
       entry.delete(0, "end") # delete all the text in the entry
       entry.insert(0, '') #Insert blank for user input


root = tk.Tk()

label = tk.Label(root, text="User: ")
label.pack(side="left")

entry = tk.Entry(root, bd=1)
entry.insert(0, 'Enter your user name...')
entry.bind('<FocusIn>', on_entry_click)
entry.pack(side="left")

root.mainloop()

相关问题 更多 >