15

私はPythonを初めて使用し、Tkinterを使用して簡単なGUIを作成しようとしています。

多くのユーザーインターフェイスでは、タブボタンを押すと、フォーカスが1つのテキストウィジェットから別のテキストウィジェットに変わることがよくあります。テキストウィジェットを表示しているときは常に、タブはテキストカーソルのみをインデントします。

これが構成可能かどうか誰かが知っていますか?

4

3 に答える 3

28

これはTkinterで非常に簡単に行えます。

これを機能させるために起こらなければならないことがいくつかあります。まず、標準の動作が発生しないことを確認する必要があります。つまり、タブでタブを挿入し、フォーカスを次のウィジェットに移動する必要はありません。デフォルトでは、イベントは、標準の動作が発生する前に特定のウィジェットによって処理されます(通常はクラスバインディングで)。Tkには、イベントがそれ以上処理されないようにするためのシンプルな組み込みメカニズムがあります。

次に、適切なウィジェットにフォーカスを送信することを確認する必要があります。次のウィジェットが何であるかを決定するための組み込みのサポートがあります。

例えば:

def focus_next_window(event):
    event.widget.tk_focusNext().focus()
    return("break")

text_widget=Text(...)
text_widget.bind("<Tab>", focus_next_window)

このコードに関する重要なポイント:

  • このメソッドtk_focusNext()は、キーボードトラバーサル階層の次のウィジェットを返します。
  • メソッドfocus()はそのウィジェットにフォーカスを設定します
  • 戻る"break"ことは、クラスバインディングが起動するのを防ぐという点で重要です。不要なタブ文字を挿入するのは、このクラスバインディングです。

アプリケーション内のすべてのテキストウィジェットに対してこの動作が必要な場合は、このバインディングをすべてのテキストウィジェットに影響させるbind_class()代わりに、メソッドを使用できます。bind()

バインディングが非常に特定のウィジェットにフォーカスを送信するようにすることもできますが、デフォルトのトラバーサル順序を使用して、トラバーサル順序が正しいことを確認することをお勧めします。

于 2009-09-20T15:57:10.737 に答える
-5

フォーカストラバーサルはある程度カスタマイズ可能で、通常はXウィンドウマネージャーで処理できます(フォーカスはマウスに続くか、クリックします)。マニュアルによるとbind、タブを押すためのキープレスイベントへのイベント、およびそのような場合のイベントのトリガーが可能であるはずfocusNextです。

于 2009-09-20T03:31:41.603 に答える
-5

PyQt4では、下の1行を使用するだけで、タブボタンを押すことでフォーカスを変更できます。

self.textEdit.setTabChangesFocus(True)

于 2017-01-18T18:47:14.623 に答える