15

私はKivyフレームワークを使用してアプリを書いていますが、マイナーですが厄介な問題に遭遇しました。テキストフィールドでTab / Enter /矢印キーを処理して、どちらかを押すとイベントがディスパッチされるようにする方法がわかりません。フォーカス(ジャンプ)を別のTextInputに切り替えるか、次のようなものを起動しますsend_form()

誰かがこの問題に光を当ててくれませんか?

4

4 に答える 4

40

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()
于 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 はタブとエンターのキー コードです。

私にとってはうまくいきます。

于 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

おそらく、ウィジェットにそのようなサポートを追加し、いくつかのフォーカス ロジックを追加して、タブ/エンターがアクティブなウィジェットに影響を与え、スライダーなどの一部のウィジェットが右/左/上/下キーも使用するようにすることをお勧めします。

そのため、Kivy でやるべきことはまだたくさんあります。もしあなたが支援することに興味があるなら、それをより迅速に実現することができます。私たちはあなたを支援します :)

于 2012-08-25T20:19:08.397 に答える