Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在tkinter中为条目添加占位符?_Python_User Interface_Tkinter - Fatal编程技术网

Python 如何在tkinter中为条目添加占位符?

Python 如何在tkinter中为条目添加占位符?,python,user-interface,tkinter,Python,User Interface,Tkinter,我在tkinter中创建了一个登录窗口,它有两个输入字段,第一个是用户名,第二个是密码。 代码 我希望在条目中有一个名为“Username”的占位符,但如果您在条目框内单击,文本将消失。您需要为此条目设置一个默认值。像这样: from tkinter import * ui = Tk() e1 = Entry(ui) e1.insert(0, 'username') e1.pack() ui.mainloop() 然后,如果要在单击条目时删除内容,则必须使用事件处理程序方法绑定鼠标单击

我在tkinter中创建了一个登录窗口,它有两个输入字段,第一个是用户名,第二个是密码。
代码


我希望在
条目中有一个名为“Username”的占位符,但如果您在条目框内单击,文本将消失。

您需要为此条目设置一个默认值。像这样:

from tkinter import *

ui = Tk()

e1 = Entry(ui)
e1.insert(0, 'username')
e1.pack()

ui.mainloop()
然后,如果要在单击条目时删除内容,则必须使用事件处理程序方法绑定鼠标单击事件以更新此条目的内容。
下面是一个示例。

您可以创建一个从
条目继承的类,如下所示:

import tkinter as tk

class EntryWithPlaceholder(tk.Entry):
    def __init__(self, master=None, placeholder="PLACEHOLDER", color='grey'):
        super().__init__(master)

        self.placeholder = placeholder
        self.placeholder_color = color
        self.default_fg_color = self['fg']

        self.bind("<FocusIn>", self.foc_in)
        self.bind("<FocusOut>", self.foc_out)

        self.put_placeholder()

    def put_placeholder(self):
        self.insert(0, self.placeholder)
        self['fg'] = self.placeholder_color

    def foc_in(self, *args):
        if self['fg'] == self.placeholder_color:
            self.delete('0', 'end')
            self['fg'] = self.default_fg_color

    def foc_out(self, *args):
        if not self.get():
            self.put_placeholder()

if __name__ == "__main__": 
    root = tk.Tk() 
    username = EntryWithPlaceholder(root, "username")
    password = EntryWithPlaceholder(root, "password", 'blue')
    username.pack()
    password.pack()  
    root.mainloop()
将tkinter作为tk导入
类EntryWithPlaceholder(tk.Entry):
定义初始化(self,master=None,placeholder=“placeholder”,color='grey'):
超级()。\uuuu初始化\uuuuu(主)
self.placeholder=占位符
self.placeholder\u color=颜色
self.default\u fg\u color=self['fg']
self.bind(“,self.foc_in)
self.bind(“,self.foc\u out)
self.put_占位符()
def put_占位符(自身):
self.insert(0,self.placeholder)
self['fg']=self.placeholder\u颜色
def foc_in(自身,*参数):
如果self['fg']==self.placeholder\u颜色:
self.delete('0','end')
self['fg']=self.default\u fg\u颜色
def foc_out(自身,*参数):
如果不是self.get():
self.put_占位符()
如果名称=“\uuuuu main\uuuuuuuu”:
root=tk.tk()
用户名=EntryWithPlaceholder(根,“用户名”)
password=EntryWithPlaceholder(根,“密码”,“蓝色”)
username.pack()
password.pack()
root.mainloop()
从tkinter导入*
root=Tk()
根几何(“300x200+600+250”)
root.config(后台=“#E0FFFF”)
根目录。可调整大小(False,False)
def userText(事件):
e1.删除(0,结束)
usercheck=True
def passText(事件):
e2.删除(0,结束)
passcheck=True
a=StringVar()
b=StringVar()
usercheck=False
passcheck=False
标签(root,text=“User name”,bg=“#E0FFFF”).place(x=20,y=50)
e1=条目(根,textvariable=a)
e1.地点(x=100,y=50)
e1.插入(0,“输入用户名”)
e1.bind(“,userText)
标签(root,text=“Password”,bg=“#E0FFFF”).place(x=20,y=95)
e2=条目(根,textvariable=b)
e2.位置(x=100,y=95)
e2.插入(0,“输入密码”)
e2.bind(“,passText)
root.mainloop()

这将适用于您想要的任何占位符

from tkinter import *
root = Tk()

my_entry = Entry(root, width=50)
my_entry.pack()
my_entry.insert(0, "Place Holder")
my_entry.configure(state=DISABLED)

def on_click(event):
    my_entry.configure(state=NORMAL)
    my_entry.delete(0, END)

    # make the callback only work once
    my_entry.unbind('<Button-1>', on_click_id)

on_click_id = my_entry.bind('<Button-1>', on_click)

root.mainloop()
从tkinter导入*
root=Tk()
my_entry=条目(根,宽度=50)
my_entry.pack()
my_条目。插入(0,“占位符”)
my_entry.configure(状态=禁用)
单击时的def(事件):
my_entry.configure(状态=正常)
my_条目。删除(0,结束)
#使回调只工作一次
my_entry.unbind(“”,单击\u id)
单击时\u id=my\u entry.bind(“”,单击时)
root.mainloop()

工作占位符类。这样做的目的是,它绑定到
,这样,当您将焦点放在它上时,如果没有文本,它会将您的
占位符插入其中。如果选择或未选择,也可以更改上的颜色

class Placeholder:
    def __init__(self,master,placeholder='',placeholdercolor='grey',color='black',**kwargs):
        self.e = Entry(master,fg=placeholdercolor,**kwargs)
        self.e.bind('<FocusIn>',self.focus_in)
        self.e.bind('<FocusOut>',self.focus_out)
        self.e.insert(0, placeholder)
        self.placeholder = placeholder
        self.placeholdercolor=placeholdercolor
        self.color = color

    def pack(self,side=None,**kwargs):
        self.e.pack(side=side,**kwargs)

    def place(self,side=None,**kwargs):
        self.e.place(side=side,**kwargs)

    def grid(self,column=None,**kwargs):
        self.e.grid(column=column,**kwargs)

    def focus_in(self,e):
        if self.e.get() == self.placeholder:
            self.e.delete(0,END)
        self.e.configure(fg=self.color)

    def focus_out(self,e):
        if self.e.get() == '':
            self.e.configure(fg=self.placeholdercolor)
            self.e.delete(0,END)
            self.e.insert(0,self.placeholder)
类占位符:
定义初始值(self,master,占位符=“”,占位符颜色=“”,占位符颜色=灰色,颜色=黑色',**kwargs):
self.e=条目(主控,fg=占位符颜色,**kwargs)
self.e.bind(“”,self.focus_in)
self.e.bind(“”,self.focus\u out)
self.e.insert(0,占位符)
self.placeholder=占位符
self.placeholder颜色=placeholder颜色
self.color=颜色
def包(自身、侧面=无,**kwargs):
自包装(侧=侧,**kwargs)
def位置(自身、侧面=无,**kwargs):
自身e.位置(侧=侧,**kwargs)
def网格(自身,列=无,**kwargs):
self.e.grid(列=列,**kwargs)
def焦点在(自我,e):
如果self.e.get()==self.placeholder:
self.e.delete(0,结束)
self.e.configure(fg=self.color)
def焦点输出(自身,e):
如果self.e.get()='':
self.e.configure(fg=self.color)
self.e.delete(0,结束)
self.e.insert(0,self.placeholder)

要获得比上面列出的更紧凑的解决方案,我建议您创建一个函数,在单击事件(lambda)时清除文本框,如下所示

from tkinter import *   

def clear_entry(event, entry):
    entry.delete(0, END)
    entry.unbind('<Button-1>', click_event)

ui = Tk()

entry = Entry(ui)

entry.pack()
placeholder_text = '<enter-placeholder>'
entry.insert(0, placeholder_text)

entry.bind("<Button-1>", lambda event: clear_entry(event, entry))

ui.mainloop()

从tkinter导入*
def清除_条目(事件,条目):
条目。删除(0,结束)
条目。解除绑定(“”,单击事件)
ui=Tk()
条目=条目(ui)
entry.pack()
占位符\文本=“”
条目.插入(0,占位符\文本)
entry.bind(“,lambda事件:清除\u条目(事件,条目))
ui.mainloop()

”代表您左键单击输入框时的状态,因此不要对其进行更改,一旦单击该框,它将触发事件并运行功能
清除输入。在定义
placeholder\u text
和使用
entry.insert
之前,必须声明函数和
entry
元素。希望这是解决这个问题的可行方法。

请发布您的代码。您尝试过什么?Stackoverflow不打算成为代码编写服务。如果我的答案有帮助,请不要忘记接受它。:)请参见,您应该绑定到
,而不是绑定到单击,因为可以通过键盘将焦点切换到输入小部件。如果您实际演示了如何做,您的答案会更好一些。根据Bryan的建议,这里有一个简单的一行代码供未来读者使用:
e1.bind(“,lambda args:e1.delete('0','end'))
@Nae请您为lambda args解释一下:我想了解better@ADWAN
bind
默认情况下将
事件
值传递到其回调按钮,这就是为什么会有
args
。我使用
lambda
的原因是我想将一些值传递给我想使用的实际方法
delete
。这可以通过定义一个自定义类标记来进一步改进,该类标记将与bindtags、bind\u class一起使用。此外,在
\uu init\uuuu\code>上接受
*args
**kwargs
,可能是明智的,尽管您可能需要处理class Placeholder: def __init__(self,master,placeholder='',placeholdercolor='grey',color='black',**kwargs): self.e = Entry(master,fg=placeholdercolor,**kwargs) self.e.bind('<FocusIn>',self.focus_in) self.e.bind('<FocusOut>',self.focus_out) self.e.insert(0, placeholder) self.placeholder = placeholder self.placeholdercolor=placeholdercolor self.color = color def pack(self,side=None,**kwargs): self.e.pack(side=side,**kwargs) def place(self,side=None,**kwargs): self.e.place(side=side,**kwargs) def grid(self,column=None,**kwargs): self.e.grid(column=column,**kwargs) def focus_in(self,e): if self.e.get() == self.placeholder: self.e.delete(0,END) self.e.configure(fg=self.color) def focus_out(self,e): if self.e.get() == '': self.e.configure(fg=self.placeholdercolor) self.e.delete(0,END) self.e.insert(0,self.placeholder)
from tkinter import *   

def clear_entry(event, entry):
    entry.delete(0, END)
    entry.unbind('<Button-1>', click_event)

ui = Tk()

entry = Entry(ui)

entry.pack()
placeholder_text = '<enter-placeholder>'
entry.insert(0, placeholder_text)

entry.bind("<Button-1>", lambda event: clear_entry(event, entry))

ui.mainloop()