用户输入相同的占位符文本python tkinter

问题描述

我为tkinter制作了一个占位符,并想将其推广,但是如果用户输入与占位符相同的文本,该占位符应该发生的所有效果都将实现到文本上。无论如何要克服这个问题?

占位符:

import tkinter as tk
from tkinter import ttk

class PlaceholderEntry(tk.Entry):
    '''
    Custom modern Placeholder Entry box,takes positional argument master and placeholder\n
    Use ret() for getting output from entry widget\n
    Use ins() for inserting into entry widget\n
    Use remove() for deleting from entry widget\n
    ISSUES: What if the user types exactly same text as the placeholders in the entrybox?
    '''

    def __init__(self,master,placeholder,**kwargs):
        # style for ttk widget
        self.s = ttk.Style()
        self.s.configure('my.TEntry')

        # init entry box
        ttk.Entry.__init__(self,style='my.TEntry',**kwargs)
        self.text = placeholder

        # add placeholder if box empty
        self.add()

        # bindings of the widget
        self.bind('<FocusIn>',self.clear)
        self.bind('<FocusOut>',self.add)
        self.bind_all('<Key>',self.normal)
        self.bind_all('<Button-1>',self.cursor)

    def clear(self,*args):
        if self.get() == self.text:  # remove placeholder when focus gain
            self.delete(0,tk.END)
            self.s.configure('my.TEntry',foreground='black',font=(0,'normal'))

    def add(self,*args):
        if self.get() == '':  # if no text add placeholder
            self.s.configure('my.TEntry',foreground='grey','bold'))
            self.insert(0,self.text)  # insert placeholder
            self.icursor(0)  # move insertion cursor to start of entrybox

    def normal(self,*args):
        self.s.configure('my.TEntry','normal'))  # set normal font
        self.add()  # if empty add placeholder
        if self.get() == self.text:  # clear the placeholder if starts typing
            self.bind('<Key>',self.clear)
            self.icursor(-1)  # keep insertion cursor to the end

    def ret(self):  # custom method to get the text
        if self.get() == self.text:
            return None
        else:
            return self.get()

    def ins(self,index,string):  # custom method to insert into entry
        self.clear()
        self.insert(index,string)

    def remove(self,first,last):  # custom method to remove from entry
        if self.get() != self.text:
            self.delete(first,last)
            self.add()

    def cursor(self,*args):  # method to not allow user to move cursor when placeholder there
        if self.get() == self.text:
            self.icursor(0)

if __name__ == '__main__':
    root = tk.Tk()
    plc = PlaceholderEntry(root,placeholder='Type')
    plc.pack(padx=10,pady=10)
    root.mainloop()

您可以通过在框上键入Type来重现该问题,因为它会将条目误认为是占位符,因此它将删除进一步的插入内容。

先谢谢您了:D

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)