15

我正在使用 Kivy 框架编写一个应用程序,我偶然发现了一个小而烦人的问题:我不知道如何处理文本字段中的Tab/Enter/Arrow键,以便按下它们中的任何一个都会发送一个事件,例如。将焦点(跳转)切换到另一个TextInput或启动类似send_form()

任何人都可以对这个问题有所了解吗?

4

4 回答 4

40

write_tab: FalseKivy 1.9 提供了在文本输入上进行设置的能力(请参阅文档),使 tab 键聚焦在下一个可聚焦的小部件上。

Kivy 允许 Enter 键通过设置multiline: False和来调度事件on_text_validate: root.foo()

因此,要创建具有所需 Enter 和 Tab 功能的文本输入小部件,请执行以下操作:

TextInput:
    write_tab: False
    multiline: False
    on_text_validate: root.foo()
于 2015-02-21T23:07:59.607 回答
7

刚刚发现了这个老问题,并认为我会做出贡献。我还需要制表符/输入才能转到下一个字段。我按照@tshirtman 的建议做了。这是我的自定义TextInput类:

from kivy.uix.textinput import TextInput


class TabTextInput(TextInput):

    def __init__(self, *args, **kwargs):
        self.next = kwargs.pop('next', None)
        super(TabTextInput, self).__init__(*args, **kwargs)

    def set_next(self, next):
        self.next = next

    def _keyboard_on_key_down(self, window, keycode, text, modifiers):
        key, key_str = keycode
        if key in (9, 13) and self.next is not None:
            self.next.focus = True
            self.next.select_all()
        else:
            super(TabTextInput, self)._keyboard_on_key_down(window, keycode, text, modifiers)

这允许您next在实例化输入时传递,或者调用set_next现有输入。

9 和 13 是 tab 和 enter 的键码。

对我来说效果很好。

于 2013-06-20T17:08:39.420 回答
4

正如 Daniel Kinsman 在他的评论中所建议的,您可以将 TextInput 子类化,添加“上一个”和“下一个”ObjectProperties 以支持选项卡(使用对其他小部件的引用很容易在 kv 中设置),并以不同的方式处理键盘事件。目前还没有开箱即用的支持,但是如果您想进行此类修改,请向我们发送功能请求或在 freenode 上的#kivy 中讨论它。

https://github.com/kivy/kivy/blob/master/kivy/uix/textinput.py#L1188

也许在小部件上添加这样的支持会更好,并添加一些焦点逻辑,因此 tab/enter 对任何可激活的小部件都有影响,并且像滑块这样的一些小部件也使用右/左/上/下键。

所以在 Kivy 中还有很多事情要做,如果你有兴趣提供帮助,你真的可以让它更快地发生,我们会帮助你 :)

于 2012-08-25T20:19:08.397 回答
0

[评论不足,所以在这里添加...]

重要的是要注意键盘 NEXT 行为只有在下一个字段由相同的键盘布局管理时才能轻松工作。但是,高级应用程序将具有:

  • 用户名(qwerty)
  • 密码(密码)
  • ID(数字)等

所以上面的方法真的行不通。

在 kv 文件中:

    MyTextInput:
        next: idTheNextFieldBelowThis

在您的 MyTextInput 类中:

    def insert_text(self, value, from_undo=False):
        #
        # Unfortunately the TextInput write_tab behavior only works if the next field is the same exact keyboard
        # type.
        #
        if not value[-1:] == '  ':
            return super(MyTextInput, self).insert_text(value, from_undo=from_undo)
        r = super(MyTextInput, self).insert_text(value[:-1], from_undo=from_undo)
        if self.next is not None:
            self.next.focus = True
        return r
于 2019-12-16T19:19:22.470 回答