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, master, 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, 0, 'normal'))
def add(self, *args):
if self.get() == '': # if no text add placeholder
self.s.configure('my.TEntry', foreground='grey',
font=(0, 0, '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', foreground='black',
font=(0, 0, '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()
ボックスに「タイプ」と入力すると、エントリがプレースホルダーと間違えられるため、それ以上の挿入が削除されるため、問題を再現できます。
よろしくお願いします:D
カスタムクラスがあるため、プレースホルダーテキストを追加するときにフラグを設定するのは簡単で、プレースホルダーを削除するときにフラグを設定解除するのも簡単です。次に、値を取得するときにフラグが設定されているかどうかを確認するだけです。
def add(self, *args):
if self.get() == '': # if no text add placeholder
...
self._has_placeholder = True
def clear(self, *args):
if self.get() == self.text: # remove placeholder when focus gain
self._has_placeholder = False
...
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加