tkinter - 如何在条目中自动添加斜杠?
tkinter - How to automatically add slashes in Entry?
当我在 Entry
中输入日期时,我希望日期之间有斜杠,如下所示:
"01/23/4567"
.
我找到了这段代码,虽然它在验证条目是否为数字的同时也能正常工作,但有一个问题。它不允许我清除条目输入。我用按钮尝试了 .delete(0, END)
方法,但似乎根本不起作用,如果你按退格键,第一个字符,本例中的 "0"
"01/23/4567"
,不会被删除, 它留在那里。
import tkinter as tk, re
class DateEntry(tk.Entry):
def __init__(self, master, **kwargs):
tk.Entry.__init__(self, master, **kwargs)
vcmd = self.register(self.validate)
self.bind('<Key>', self.format)
self.configure(validate="all", validatecommand=(vcmd, '%P'))
self.valid = re.compile('^\d{0,2}(\\\d{0,2}(\\\d{0,4})?)?$', re.I)
def validate(self, text):
if ''.join(text.split('\')).isnumeric():
return not self.valid.match(text) is None
return False
def format(self, event):
if event.keysym != 'BackSpace':
i = self.index('insert')
if i in [2, 5]:
if self.get()[i:i+1] != '\':
self.insert(i, '\')
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
DateEntry(self, width=10).grid(row=0, column=0)
if __name__ == "__main__":
root = Main()
root.geometry('800x600')
root.title("Date Entry Example")
root.mainloop()
如果您需要能够清除小部件,您的验证函数需要考虑空值的特殊情况。
def validate(self, text):
if text.strip() == "":
# allow a completely empty entry widget
return True
if text ''.join(text.split('\')).isnumeric():
return not self.valid.match(text) is None
return False
当我在 Entry
中输入日期时,我希望日期之间有斜杠,如下所示:
"01/23/4567"
.
我找到了这段代码,虽然它在验证条目是否为数字的同时也能正常工作,但有一个问题。它不允许我清除条目输入。我用按钮尝试了 .delete(0, END)
方法,但似乎根本不起作用,如果你按退格键,第一个字符,本例中的 "0"
"01/23/4567"
,不会被删除, 它留在那里。
import tkinter as tk, re
class DateEntry(tk.Entry):
def __init__(self, master, **kwargs):
tk.Entry.__init__(self, master, **kwargs)
vcmd = self.register(self.validate)
self.bind('<Key>', self.format)
self.configure(validate="all", validatecommand=(vcmd, '%P'))
self.valid = re.compile('^\d{0,2}(\\\d{0,2}(\\\d{0,4})?)?$', re.I)
def validate(self, text):
if ''.join(text.split('\')).isnumeric():
return not self.valid.match(text) is None
return False
def format(self, event):
if event.keysym != 'BackSpace':
i = self.index('insert')
if i in [2, 5]:
if self.get()[i:i+1] != '\':
self.insert(i, '\')
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
DateEntry(self, width=10).grid(row=0, column=0)
if __name__ == "__main__":
root = Main()
root.geometry('800x600')
root.title("Date Entry Example")
root.mainloop()
如果您需要能够清除小部件,您的验证函数需要考虑空值的特殊情况。
def validate(self, text):
if text.strip() == "":
# allow a completely empty entry widget
return True
if text ''.join(text.split('\')).isnumeric():
return not self.valid.match(text) is None
return False