ほとんどの場合に機能する単純な解決策は、<KeyRelease>
にバインドすることです。これにより、ユーザーが入力するたびに関数を呼び出すことができます。これは、データがマウスで貼り付けられたり、他の手段(ツールバーボタンなど)を使用して挿入されるたびにコールバックをトリガーしません。
より堅牢なソリューションは、ウィジェットに何かが挿入または削除されるたびにイベントが生成されるように、ウィジェットのプロキシを設定することです。このプロキシは、ウィジェットで何が行われているか(挿入、削除、選択の変更など)を見て、イベントを生成することができます。このイベントにバインドして、必要な操作を行うことができます。このプロキシは、4つの物事ん
import tkinter as tk
class CustomText(tk.Text):
def __init__(self, *args, **kwargs):
"""A text widget that report on internal widget commands"""
tk.Text.__init__(self, *args, **kwargs)
# create a proxy for the underlying widget
self._orig = self._w + "_orig"
self.tk.call("rename", self._w, self._orig)
self.tk.createcommand(self._w, self._proxy)
def _proxy(self, command, *args):
cmd = (self._orig, command) + args
result = self.tk.call(cmd)
if command in ("insert", "delete", "replace"):
self.event_generate("<<TextModified>>")
return result
:データが挿入または削除されるたびにここで
が<<TextModified>>
イベントを生成するカスタムテキストクラスの例です
- はまず、それが実際のウィジェットを呼び出しますコマンドは、受け取ったすべての引数を渡します。
- 次はそれがすべての挿入のためのイベントを生成し、すべてのそれは、仮想イベント
- を生成し、そして最後に、それはあなたがこのウィジェットを正確に使用することができます
実際のウィジェットコマンドの結果を返します。そして、
削除します他のTextウィジェットと同様に、<<TextModified>>
にバインドできるという利点があります。あなたがテキストウィジェット内の文字数を表示したい場合 は、たとえば、あなたがこのような何かを行うことができます:
import tkinter as tk
# ... import of definition of CustomText goes here ...
root = tk.Tk()
label = tk.Label(root, anchor="w")
text = CustomText(root, width=40, height=4)
label.pack(side="bottom", fill="x")
text.pack(side="top", fill="both", expand=True)
def onModification(event):
chars = len(event.widget.get("1.0", "end-1c"))
label.configure(text="%s chars" % chars)
text.bind("<<TextModified>>", onModification)
root.mainloop()
を、私はあなたが 'after'方法を探していると思います。https://のstackoverflow .com/questions/25753632/tkinter-how-to-use-after-method –
@ j_4321 'after'メソッドは?それは各ループの代わりに時間に基づいて行うのではないでしょうか? –
ウィジェットに応じて、StringVar/IntVarと '.trace'メソッドを使用できます。これにより、すべての変更に対して 'trace 'が実行されることに注意してください。同様の考え方ですが、ここに表示されている 'Text'ウィジェットで' .bind'を使用しています:https://stackoverflow.com/questions/17120429/validation-on-tkinter-text-widget – Lafexlos