繁体   English   中英

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

[英]How to insert a temporary text in a tkinter Entry widget?

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

例如,我有一个标签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小部件上的数据。

我想在没有说过的回复中添加一些内容。 正如9jera所说,我们只有在看到默认文本而不是Leo Tenenbaum使用的“firstclick”方法时才能使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
       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...那里Enter your user name... ,重点关注,即使文本是由用户自己编写的,文本也会被删除。 我想到的一个解决方案是更改if语句,以便在删除任何内容之前获取颜色而不是默认文本。 如果颜色为灰色,则可以继续并删除它。 否则,它不会。 然而,我还没有找到获得文本颜色的方法。 如果有人知道这件事,请告诉我!

编辑:显然,正如Olivier Samson指出的那样,可以通过使用entry.cget('fg')获得条目的颜色。 我猜,2年后,我终于弄清楚如何做到这一点。

因此,我们现在可以更改行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 entryEnter 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM