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

新手上路,请多包涵

如何在 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 小部件上的数据。

原文由 Ds Arjun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 687
2 个回答

我想对尚未提及的答复进行补充。正如 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') 获取条目的颜色。我想,2 年后,我终于弄清楚该怎么做。

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

原文由 notTypecast 发布,翻译遵循 CC BY-SA 4.0 许可协议

我认为这应该有效:

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

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

原文由 pommicket 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题