Python:それにバインドされたコマンドで使用する更新されたエントリテキストを取得するにはどうすればよいですか?
-
28-09-2019 - |
質問
次のコードを検討してください。
text = Entry(); text.pack()
def show(e):
print text.get()
text.bind('<Key>', show)
エントリに文字ABCを1つずつ入れたとしましょう。出力は次のとおりです。
>>>
>>> A
>>> AB
Aを押すと、空の文字列が印刷されることに注意してください。 Bを押すと、ABではなくAを印刷します。 Cの後に何も押さなければ、それは決して表示されません。エントリコンテンツは、バインドコマンドが返された後にのみ更新されるため、その関数の実際のエントリ値を使用することはできません。
バインドコマンド内で使用する更新されたエントリ値を取得する方法はありますか?
解決
置き換えることができます <Key>
とのイベント <KeyRelease>
イベント。それはうまくいくはずです。
これがイベントのリストです: http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types
他のヒント
この理由は、TK「Bindtags」に関係しています。バインディングはタグに関連付けられ、バインディングはタグの順序で処理されます。ウィジェット名とウィジェットの両方のクラスはタグであり、それらはその順序で処理されます(ウィジェット固有のバインディング最初、クラスバインディングは2番目)。
そのため、キーを押すと、クラスバインディングがウィジェットを変更する機会がある前に、ウィジェット固有のバインディングが発射されます。
多くの回避策があります。最も簡単なのは、バインドすることです <KeyRelease>
クラスのバインディングがキープレスで発生するため。バインドタグの追加または再配置、またはエントリウィジェットの組み込みデータ検証機能の使用を含む他のソリューションがあります。これは、あなたが本当に達成しようとしていることに依存します。
データ検証関数の詳細については、この質問を参照してください。 TKINTERのエントリウィジェットコンテンツをインタラクティブに検証します
より包括的な答えについては、参照してください TKINTER:後にstringvarを設定しますu003CKey>キーを含むイベント