<p>我想补充一些尚未回答的问题。正如<a href="https://stackoverflow.com/users/4854276/9jera">9jera</a>所说,只有当Entry小部件看到默认文本,而不是<a href="https://stackoverflow.com/users/4933116/leo-tenenbaum">Leo Tenenbaum</a>使用的“firstclick”方法时,我们才能使其清除。</p>
<p>如果用户在不输入任何内容的情况下将焦点转到另一个小部件,我们还可以添加第二个函数来填充Entry小部件。</p>
<p>这可以通过以下方式实现:</p>
<pre><code>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()
</code></pre>
<p>最后,我还为默认文本添加了灰色,为用户编写的文本添加了黑色,这是为那些对此感到疑惑的人准备的。我在这里看到的唯一问题是,如果用户实际在其中手动键入<code>Enter your user name...</code>,并将焦点放在外面和里面,那么即使文本是由用户自己编写的,也将被删除。我想到的一个解决方案是更改if语句,以便在删除任何内容之前获得颜色而不是默认文本。如果颜色是灰色,可以继续删除。否则,就不会了。但是,我还没有找到一种方法来获得文本颜色。如果有人知道,请告诉我!</p>
<p>编辑:显然,正如<a href="https://stackoverflow.com/users/7623655/olivier-samson">Olivier Samson</a>所指出的,使用<code>entry.cget('fg')</code>可以获得条目的颜色。我想,两年后,我终于想出了怎么做。</p>
<p>因此,我们现在可以将线<code>if entry.get() == 'Enter your user name...':</code>更改为<code>if entry.cget('fg') == 'grey':</code>。这样,每当第一次单击条目并在其中键入任何内容时,颜色将更改为黑色,因此下次用户聚焦时,它不会删除任何文本(即使该文本是<code>Enter your user name...</code>)。</p>