私はKivyフレームワークを使用してアプリを書いていますが、マイナーですが厄介な問題に遭遇しました。テキストフィールドでTab / Enter /矢印キーを処理して、どちらかを押すとイベントがディスパッチされるようにする方法がわかりません。フォーカス(ジャンプ)を別のTextInputに切り替えるか、次のようなものを起動しますsend_form()
誰かがこの問題に光を当ててくれませんか?
Kivy 1.9 は、write_tab: False
テキスト入力 ( docs を参照) を設定する機能を提供し、タブ キーが次のフォーカス可能なウィジェットにフォーカスするようにします。
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 はタブとエンターのキー コードです。
私にとってはうまくいきます。
Daniel Kinsman のコメントで示唆されているように、TextInput をサブクラス化し、タブをサポートするために「前」と「次」の ObjectProperties を追加し (他のウィジェットへの参照を使用して kv で簡単に設定できます)、キーボード イベントを別の方法で処理することができます。現時点では、すぐに使用できるサポートはありませんが、そのような変更に取り組みたい場合は、機能リクエストを送信するか、freenode の #kivy で議論してください。
https://github.com/kivy/kivy/blob/master/kivy/uix/textinput.py#L1188
おそらく、ウィジェットにそのようなサポートを追加し、いくつかのフォーカス ロジックを追加して、タブ/エンターがアクティブなウィジェットに影響を与え、スライダーなどの一部のウィジェットが右/左/上/下キーも使用するようにすることをお勧めします。
そのため、Kivy でやるべきことはまだたくさんあります。もしあなたが支援することに興味があるなら、それをより迅速に実現することができます。私たちはあなたを支援します :)