2009-09-20 2 views
9

私はPythonを初めて使いました.Tkinterを使って簡単なGUIを作成しようとしています。1つのテキストウィジェットから別のテキストウィジェットにフォーカスを変更

多くのユーザーインターフェイスでは、タブボタンを押すと、あるテキストウィジェットから別のテキストウィジェットにフォーカスが変更されることがよくあります。テキストウィジェット内にあるときは、タブはテキストカーソルだけをインデントします。

これが設定可能かどうかは知っていますか?そうでない場合、PyQtまたは他のPython UIフレームワークでこの機能を利用できますか?

答えて

15

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

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

第2に、適切なウィジェットにフォーカスを移す必要があります。次のウィジェットが何であるかを判断するための組み込みサポートがあります。例えば

:このコード約

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

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

重要事項:

  • キーボードトラバーサル階層内の次のウィジェットを返しtk_focusNext()方法。 "break"を返すそのウィジェット
  • にフォーカスを設定しますfocus()
  • 方法は、それは発射からバインディングクラスを防ぐという点で重要です。あなたが望まないタブ文字を挿入するのはこのクラスバインディングです。

あなたは、この結合は、すべてのテキストウィジェットに影響を与える作る代わりにbind()bind_class()メソッドを使用することができ、アプリケーション内のすべてのテキストウィジェットのため、この動作が必要な場合。

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

+1

帰り( "ブレーク")のヒントはちょうど私の日を救った、ブライアンに感謝! – Symon

+0

に応答していくつかの追加ステップを実行する方法についてほとんど関係のない質問がありました**実際にはがデフォルトの動作を実行するのを止めることなく**。この答えはそれを完全にカバーしました。ありがとう! – JDM

-3

クロスプラットフォームの性質のため、フォーカストラバーサルは多少カスタマイズ可能です。通常、Xウィンドウマネージャーはこれを処理します(フォーカスはマウスまたはクリック)。 the manualによれば、bindは、キープレスイベントへのイベント、タブプレスのスキャン、およびこれらの場合にはfocusNextイベントのトリガーとなる可能性があります。

+0

、私は得ることはありませんそれ;私は正確に何がhttp:// stackoverflowを提案した。com/users/7432/bryan-oakleyが彼の受け入れられた答えで書いたhttp://stackoverflow.com/questions/1450180/how-can-i-change-the-focus-from-one-text-box-to-another- in-python-tkinter/1451343#1451343私はしませんでしたか? – dlamblin

+0

あなたの答えは役に立たないほど弱いです。私はフォーカストラバーサルが "クロスプラットフォームの性質のために"カスタマイズ可能であるとは思えません。クロスプラットフォームはそれとは関係ありません。さらに、あなたの答えは「可能でなければならない」と答えています。もし私が助けを求めていると誰かが "それは可能でなければならない"と言っているが、私はそれが非常に安心しているとは思っていない。それともそうでないかです。そして最後に「タブプレスをスキャンする」というのは意味をなさない。「タブプレスのためにスキャンする」方法はなく、あなたはそれを行う方法を言わない。あなたの答えは推測であるように思えますが、それはあまり有用ではありません。 –

0

TKinterについてはわかりませんが、PyQtでは、タブボックスから出力されたタブ変更信号に関数を接続できます(シグナルはint値を持ちます)。しかし、私が知っている限り、Qtはそれが指定されていない状態で適切なことを行うことにかなり優れています。

0

単に以下、この1つの行を使用して、タブボタンを押してフォーカスを変更することができるようになりますPyQt4で本当に簡単です:

self.textEdit.setTabChangesFocus(真)

関連する問題