在Kivy的TextInput小部件中进行Tab/Enter(和其他击键)处理

min*_*der 12 python kivy

我正在使用Kivy框架编写一个应用程序,我偶然发现了一个轻微但令人讨厌的问题:我不知道如何处理文本字段中的Tab/Enter/Arrow键,以便按下其中任何一个键都会调度一个事件,例如.将焦点(跳转)切换到另一个TextInput或启动类似的东西send_form()

有谁能请对这个问题有所了解?

mca*_*tle 27

Kivy 1.9提供了设置write_tab: False文本输入(参见文档)的功能,使tab键可以专注于下一个可聚焦的小部件.

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

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

TextInput:
    write_tab: False
    multiline: False
    on_text_validate: root.foo()
Run Code Online (Sandbox Code Playgroud)


dge*_*gel 7

刚发现这个老问题,并认为我会做出贡献.我还需要tab/enter才能转到下一个字段.我做了@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)
Run Code Online (Sandbox Code Playgroud)

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

9和13是tab和enter的关键代码.

对我来说效果很好.


Tsh*_*man 5

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

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

也许在小部件上添加这样的支持并添加一些焦点逻辑会更好,因此选项卡/输入对任何可激活的小部件都有影响,并且某些小部件(例如滑块)也使用右/左/上/下键。

因此,Kivy 在这方面还有很多工作要做,如果您有兴趣提供帮助,您确实可以让它更快地实现,我们会帮助您:)

  • @tshirtman,与此主题类似,在 Kivy 的文档中 ` `on_text_validate 仅在 multiline=False 模式下,当用户点击“enter”时触发。这也将使文本输入失去焦点。`。单击回车键后如何保持焦点。 (3认同)