解决方案
覆盖
do_backspace()
文本输入中的方法。如果文本是“/”,则返回true,表示我们已经使用了backspace,不希望它进一步传播。
最后,如果文本不是“/”,我们使用super()调用原始事件并返回结果。这允许do_backspace事件传播继续正常进行。
详情请参阅示例。
do_backspace(from_undo=False, mode='bkspc')
从当前光标位置执行退格操作。这个动作
可能做几件事:
删除当前选择(如果可用)。
删除上一个字符并将光标移回。
如果我们在开始就什么都不做。
例子
主.py
from kivy.app import App
from kivy.uix.textinput import TextInput
import re
class DateInput(TextInput):
def do_backspace(self, from_undo=False, mode='bkspc'):
print(from_undo, mode)
if len(self.text) >= 1:
if self.text[-1] == "/":
self.text = self.text[:-1]
return True # we have consumed the backspace and donât want it to propagate any further
return super(DateInput, self).do_backspace(from_undo, mode)
#filter for date formatting which works well aside from backspacing
pat = re.compile('[^0-9]')
def insert_text(self, substring, from_undo=False):
pat = self.pat
if len(substring) > 1:
substring = re.sub(pat, '', (self.text + substring))
self.text = ''
slen = len(substring)
if slen == 2:
s = substring[:2] + '/'
elif slen == 3:
s = substring[:2] + '/' + substring[2:]
elif slen == 4:
s = substring[:2] + '/' + substring[2:] + '/'
else:
s = substring[:2] + '/' + substring[2:4] + '/' + substring[4:8]
elif len(self.text) > 9:
s = ''
elif len(self.text) == 1:
s = re.sub(pat, '', substring)
if s != '':
s = s + '/'
elif len(self.text) == 4:
s = re.sub(pat, '', substring)
if s != '':
s = s + '/'
else:
s = re.sub(pat, '', substring)
return super(DateInput, self).insert_text(s, from_undo=from_undo)
class TestApp(App):
def build(self):
return DateInput()
if __name__ == "__main__":
TestApp().run()
输出