1

次のコードを検討してください。

text = Entry(); text.pack()
def show(e):
    print text.get()
text.bind('<Key>', show)

エントリにABCの文字を1つずつ入れたとしましょう。出力は次のようになります。

>>> 
>>> A
>>> AB

Aを押すと、空の文字列が出力されることに注意してください。Bを押すと、ABではなくAが出力されます。Cの後に何も押さないと、表示されません。エントリの内容は、バインドされたコマンドが返された後にのみ更新されるようです。そのため、その関数で実際のエントリ値を使用することはできません。

バインドされたコマンド内で使用する更新されたエントリ値を取得する方法はありますか?

4

2 に答える 2

3

<Key>イベントをイベントに置き換えることができ<KeyRelease>ます。それはうまくいくはずです。

イベントのリストは次のとおりです:http://infohost.nmt.edu/tcc/help/pubs/tkinter/events.html#event-types

于 2010-11-26T18:06:31.467 に答える
2

この理由は、Tkの「bindtags」と関係があります。バインディングはタグに関連付けられており、バインディングはタグ順に処理されます。ウィジェット名とウィジェットクラスはどちらもタグであり、この順序で処理されます(最初にウィジェット固有のバインディング、次にクラスバインディング)。

そのため、キーを押すと、クラスバインディングがウィジェットを変更する前に、ウィジェット固有のバインディングが起動します。

多くの回避策があります。<KeyRelease>クラスバインディングはキーを押すと発生するため、最も簡単なのはバインドすることです。バインドタグを追加または再配置するか、エントリウィジェットの組み込みデータ検証機能を使用するソリューションは他にもあります。どちらが最適かは、実際に何を達成しようとしているかによって異なります。

データ検証機能の詳細については、次の質問を参照してください:tkinterでのエントリウィジェットコンテンツのインタラクティブな検証

より包括的な回答については、Tkinter:<Key>イベントの後にStringVarを設定する(押されたキーを含む)を参照してください。

于 2010-11-26T18:50:03.660 に答える