如何在 tkinter Entry 小部件中插入临时文本?
How to insert a temporary text in a tkinter Entry widget?
如何在 tkinter Entry
小部件中插入临时文本?
例如,我有一个标签 User
,在它旁边有一个条目小部件,在应用程序的开头应该有一些文本 "Enter your username..."
,同时将光标放在条目上小部件,它应该删除 "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()
我该怎么做?
我没有找到任何选项或方法来删除将光标放在条目小部件上的数据。
我认为这应该可行:
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 小部件设置为默认文本时,您才能使 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()
我想补充一些没有说的回复。作为 9jera said, we can make the Entry widget clear only when it sees the default text instead of the "firstclick" method used by Leo Tenenbaum.
如果用户在没有输入任何内容的情况下将焦点转移到另一个小部件,我们还可以添加第二个函数来重新填充 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...
).
这对我有用。
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()
如何在 tkinter Entry
小部件中插入临时文本?
例如,我有一个标签 User
,在它旁边有一个条目小部件,在应用程序的开头应该有一些文本 "Enter your username..."
,同时将光标放在条目上小部件,它应该删除 "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()
我该怎么做?
我没有找到任何选项或方法来删除将光标放在条目小部件上的数据。
我认为这应该可行:
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 小部件设置为默认文本时,您才能使 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()
我想补充一些没有说的回复。作为 9jera said, we can make the Entry widget clear only when it sees the default text instead of the "firstclick" method used by Leo Tenenbaum.
如果用户在没有输入任何内容的情况下将焦点转移到另一个小部件,我们还可以添加第二个函数来重新填充 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...
).
这对我有用。
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()