首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Kivy Python:检测文本输入中的退格

Kivy Python:检测文本输入中的退格
EN

Stack Overflow用户
提问于 2018-06-29 11:08:10
回答 3查看 1.1K关注 0票数 3

我正在尝试为日期创建一个简单的TextInput,它将输入限制为数字,并自动填充(mm/dd/yy)格式的正斜杠。我成功地创建了一个过滤器,它通过重新定义insert_text()来实现这一点,除了当用户使用退格键时,我还想自动删除斜杠。但我不知道如何检测用户何时在文本输入中退格,以便在必要时触发一个事件来擦除斜杠。

下面的代码片段解释了我想要做什么,但是TextInput没有"on_key_up“属性。有没有办法添加一个?或者有更好的方法来做这件事?

代码语言:javascript
复制
# .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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-29 11:45:57

由于1.9.0版TextInputFocusBehavior固有的,因此如果您想要检测何时按backspace,则必须使用keyboard_on_key_down()方法或keyboard_on_key_up()方法:

代码语言:javascript
复制
from kivy.app import App
from kivy.uix.textinput import TextInput

class DateInput(TextInput):
    def keyboard_on_key_down(self, window, keycode, text, modifiers):
        if keycode[1] == "backspace":
            print("print backspace down", keycode)
        TextInput.keyboard_on_key_down(self, window, keycode, text, modifiers)

    def keyboard_on_key_up(self, window, keycode, text, modifiers):
        if keycode[1] == "backspace":
            print("print backspace up", keycode)
        TextInput.keyboard_on_key_down(self, window, keycode, text, modifiers)


class MyApp(App):
    def build(self):
        return DateInput()

if __name__ == '__main__':
    MyApp().run()
票数 0
EN

Stack Overflow用户

发布于 2018-07-01 06:38:29

对于任何想要自动格式化日期输入的人来说,这是一个完整的解决方案:

代码语言:javascript
复制
class DateInput(TextInput):
    def keyboard_on_key_up(self, window, keycode):
        if keycode[1] == "backspace" and len(self.text) >= 1:
            if self.text[-1] == "/":
                self.text = self.text[:-1]
            else:
                pass
        else:
            pass
        TextInput.keyboard_on_key_up(self, window, keycode)

    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) == 2:
            s = re.sub(pat, '', substring)
            if s != '':
                s = '/' + s
        elif len(self.text) == 5:
            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)
票数 0
EN

Stack Overflow用户

发布于 2021-04-06 12:26:39

以下是我的解决方案:

代码语言:javascript
复制
class DateInput(TextInput):
    pat = re.compile("[^0-9]")

    def insert_text(self, substring, from_undo=False):
        pat = self.pat
        s = re.sub(pat, "", substring)
        if len(self.text) >= 10:
            return super(DateInput, self).insert_text("", from_undo=from_undo)
        elif ((len(self.text) > 2) and (self.cursor_index() == 2)) or (
            (len(self.text) > 5) and (self.cursor_index() == 5)
        ):
            return super(DateInput, self).insert_text("/", from_undo=from_undo)
        elif (len(self.text) == 2) or (len(self.text) == 5):
            return super(DateInput, self).insert_text("/" + s, from_undo=from_undo)
        else:
            return super(DateInput, self).insert_text(s, from_undo=from_undo)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51093710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档