我正在使用 Kivy 框架编写一个应用程序,我偶然发现了一个小而烦人的问题:我不知道如何处理文本字段中的Tab/Enter/Arrow键,以便按下它们中的任何一个都会发送一个事件,例如。将焦点(跳转)切换到另一个TextInput或启动类似send_form()
任何人都可以对这个问题有所了解吗?
write_tab: False
Kivy 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()
刚刚发现了这个老问题,并认为我会做出贡献。我还需要制表符/输入才能转到下一个字段。我按照@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 的键码。
对我来说效果很好。
正如 Daniel Kinsman 在他的评论中所建议的,您可以将 TextInput 子类化,添加“上一个”和“下一个”ObjectProperties 以支持选项卡(使用对其他小部件的引用很容易在 kv 中设置),并以不同的方式处理键盘事件。目前还没有开箱即用的支持,但是如果您想进行此类修改,请向我们发送功能请求或在 freenode 上的#kivy 中讨论它。
https://github.com/kivy/kivy/blob/master/kivy/uix/textinput.py#L1188
也许在小部件上添加这样的支持会更好,并添加一些焦点逻辑,因此 tab/enter 对任何可激活的小部件都有影响,并且像滑块这样的一些小部件也使用右/左/上/下键。
所以在 Kivy 中还有很多事情要做,如果你有兴趣提供帮助,你真的可以让它更快地发生,我们会帮助你 :)
[评论不足,所以在这里添加...]
重要的是要注意键盘 NEXT 行为只有在下一个字段由相同的键盘布局管理时才能轻松工作。但是,高级应用程序将具有:
所以上面的方法真的行不通。
在 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