Я пытаюсь создать простой TextInput для дат, который ограничивает ввод цифрами и автоматически заполняет косую черту для формата (мм / дд / гг). Мне удалось создать фильтр, который делает это путем переопределения insert_text (), за исключением случаев, когда пользователь забивает, я хочу также автоматически удалять косые черты. Но я не знаю, как определить, когда пользователь вводит пробелы в текстовом вводе, чтобы я мог запустить событие, чтобы стереть косую черту, если это необходимо.
Вот фрагмент, который объясняет, что я хочу сделать, но TextInput не имеет атрибута "on_key_up". Есть ли способ добавить один? Или лучший способ сделать это?
# .kv file
<DateInput>
on_key_up: self.check_for_backspace(keycode) # not a true attribute
# .py file
class DateInput(TextInput):
# checks if last character is a slash and removes it after backspace keystroke. Not sure this would work.
def check_for_backspace(self, keycode):
if keycode[1] == 'backspace' and self.text[-1:] == '/':
self.text = self.text[:-1]
#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)