【问题标题】:How to insert a temporary text in a tkinter Entry widget?如何在 tkinter 条目小部件中插入临时文本?
【发布时间】:2015-05-27 19:42:11
【问题描述】:

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

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

这是我当前的代码:

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

我该怎么做?

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

【问题讨论】:

标签: python python-2.7 python-3.x tkinter tkinter-entry


【解决方案1】:

我想在尚未提及的回复中添加一些内容。正如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...,然后再次聚焦,即使是用户自己编写的文本也会被删除。我想到的一种解决方案是更改 if 语句,以便在删除任何内容之前获取颜色而不是默认文本。如果颜色为灰色,则可以继续删除它。否则,它不会。但是,我还没有找到获取文本颜色的方法。如果有人知道这件事,请告诉我!

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

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

【讨论】:

  • 要获取条目文本颜色,您可以使用 cget 如下:entry.cget('fg')
  • if entry.get() == ''" #这种情况很危险,应该是这样的 =>if len(entry.get()) - entry.get()。 count(' ')
【解决方案2】:

我认为这应该可行:

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...

【讨论】:

  • 如果他们使用 tab 键将焦点移动到 entrt,这将不起作用。最好绑定&lt;FocusIn&gt;
【解决方案3】:

这对我有用。

import tkinter  

window = tkinter.Tk()
NameVar = tkinter.StringVar(value="")

################ Enter name ################
FillName = tkinter.Entry(textvariable=NameVar)
FillName.insert(0, "Enter your name here.")
FillName.pack()
FillName.bind("<FocusIn>", lambda event: FillName.delete(0,"end") if NameVar.get() == "Enter your name here." else None)
FillName.bind("<FocusOut>", lambda event: FillName.insert(0, "Enter your name here.") if NameVar.get() == "" else None)


window.mainloop()

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多