1

Python/tkInter を使用してテキストの入力を検証しようとしています

def validate_text():
    return False

text = Entry(textframe, validate="focusout", validatecommand=validate_text)

ここで、validate_text は関数です - 私は常に False を返し、常に True を返そうとしましたが、結果に違いはありません..? 関数に含める必要がある一連の引数はありますか?

編集 - NONE から focusout に変更されました...まだ機能していません

4

4 に答える 4

2

あなたが欠けているのはinvalidcommand (or invcmd). false が返された場合、validatecommand (または vcmd) が何をすることを期待していますか? Tk マニュアル (下記参照) によると、vcmd が False を返し、validate がnone に設定されていない場合、invcmd が呼び出されます。invcmd の典型的なコマンドは Tkinter.bell で、これはディン音を出します。また、vcmd と invcmd は非常に扱いやすく例外が発生した場合、vcmd または invcmd 関数内でウィジェットが変更された場合、または vcmd が有効な Tcl ブール値を返さない場合は、validate を「none」に変更します。特に、textvariable は問題を引き起こすことで有名であり、Entry の valdation と呼ばれるセクションが特にそれを扱っています。

Tk Command Entry の関連部分を次に示します (Spinbox と同じ)。詳細については、以下を参照してください。

コマンドライン名:-validatecommand or -vcmd
データベース名:validateCommand
データベース クラス:ValidateCommand
エントリ ウィジェットへの入力を検証するときに評価するスクリプトを指定します。{} に設定すると、この機能が無効になります (デフォルト)。このコマンドは、有効な Tcl ブール値を返す必要があります。0 (または同等の有効な Tcl ブール値) が返された場合は、新しいエディションを拒否したことを意味し、新しいエディションは発生せず、invalidCommand が設定されている場合は評価されます。1 を返す場合、新しいエディションが発生します。詳細については、以下の検証を参照してください。

コマンドライン名:-invalidcommand or -invcmd
データベース名:invalidCommand
データベース クラス: InvalidCommand
validateCommand が 0 を返したときに評価するスクリプトを指定します。{} に設定すると、この機能が無効になります (デフォルト)。このオプションの最適な使用法は、ベルに設定することです。詳細については、以下の検証を参照してください。

詳細については、この SO answerTk コマンド、およびepydoc-Tkinterを参照してください。

この質問には非常に多くの重複があります。 Python tkInter Entry fun
Tkinter Entry ウィジェットの値を制限する

于 2012-08-02T22:13:34.433 に答える
1

focusoutこれは、入力ウィジェットからフォーカスを外したときにのみ、validatecommand が呼び出されることを意味します。

入力中に検証するために「キー」を試すことができます。

Tcl マニュアル:
次のように、検証オプションに従って評価されるスクリプトに validateCommand オプションを設定することにより、検証が機能します。

  • なし
    デフォルト。これは、検証が行われないことを意味します。

  • focus
    validateCommand は、エントリがフォーカスを受け取るか失ったときに呼び出されます。

  • エントリがフォーカスを受け取ると、 focusin
    validateCommand が呼び出されます。

  • エントリがフォーカスを失うと、 focusout
    validateCommand が呼び出されます。

  • キー
    validateCommand は、エントリが編集されるときに呼び出されます。

  • 上記のすべての条件に対してすべて
    の validateCommand が呼び出されます。

于 2012-02-12T03:13:48.693 に答える