我正在使用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)
刚发现这个老问题,并认为我会做出贡献.我还需要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的关键代码.
对我来说效果很好.
正如 Daniel Kinsman 在他的评论中所建议的,您可以子类化 TextInput,添加“上一个”和“下一个”ObjectProperties 以支持选项卡(使用对其他小部件的引用轻松在 kv 中设置),并以不同的方式处理键盘事件。目前还没有对此进行开箱即用的支持,但如果您想进行此类修改,请向我们提出功能请求或在 freenode 上的 #kivy 中讨论它。
https://github.com/kivy/kivy/blob/master/kivy/uix/textinput.py#L1188
也许在小部件上添加这样的支持并添加一些焦点逻辑会更好,因此选项卡/输入对任何可激活的小部件都有影响,并且某些小部件(例如滑块)也使用右/左/上/下键。
因此,Kivy 在这方面还有很多工作要做,如果您有兴趣提供帮助,您确实可以让它更快地实现,我们会帮助您:)