質問
Pythonで遊ぶ-tkInter-入力ウィジェット-validatecommand(下)を使用すると、文字列>が最初にチェックされます。 Max。ただし、テキストを入力し続けると、チェック手順が実行されます。最初に削除または挿入はありませんか?何かアドバイス? (Pythonを介してデスクトップアプリを構築しない以外)
#!/usr/bin/env python
from Tkinter import *
class MyEntry(Entry):
def __init__(self, master, maxchars):
Entry.__init__(self, master, validate = "key", validatecommand=self.validatecommand)
self.MAX = maxchars
def validatecommand(self, *args):
if len(self.get()) >= self.MAX:
self.delete(0,3)
self.insert(0, "no")
return True
if __name__ == '__main__':
tkmain = Tk()
e = MyEntry(tkmain, 5)
e.grid()
tkmain.mainloop()
解決
validateCommandまたはinvalidCommand内からエントリウィジェットを編集するときに、検証オプションはそれ自体をnoneに設定します。このようなエディションは、検証されていたエディションをオーバーライドします。検証中にエントリウィジェットを編集(たとえば{}に設定)し、検証オプションを設定したままにする場合は、コマンドを含める必要があります
アイドル状態の後{%W config -validate%v}
Pythonに翻訳する方法がわからない。
他のヒント
入力を5文字に制限するコードサンプルを次に示します。
import Tkinter as tk
master = tk.Tk()
def callback():
print e.get()
def val(i):
print "validating"
print i
if int(i) > 4:
print "False"
return False
return True
vcmd = (master.register(val), '%i')
e = tk.Entry(master, validate="key", validatecommand=vcmd)
e.pack()
b = tk.Button(master, text="OK", command=lambda: callback())
b.pack()
tk.mainloop()
大量の印刷ステートメントを投げたので、コンソールで何をしているのかを見ることができます。
渡すことができる他の置換は次のとおりです:
%d Type of action: 1 for insert, 0 for delete, or -1 for focus,
forced or textvariable validation.
%i Index of char string to be inserted/deleted, if any, otherwise -1.
%P The value of the entry if the edit is allowed. If you are config-
uring the entry widget to have a new textvariable, this will be
the value of that textvariable.
%s The current value of entry prior to editing.
%S The text string being inserted/deleted, if any, {} otherwise.
%v The type of validation currently set.
%V The type of validation that triggered the callback (key, focusin,
focusout, forced).
%W The name of the entry widget.
その理由は確かにわかりますが、気がついています。検証チェックは、エントリが編集されるたびに実行されます。いくつかのテストを行ったところ、実際に実行され、検証中に毎回あらゆる種類のことを実行できることがわかりました。 validatecommand関数内から編集すると、正しく機能しなくなります。これにより、検証関数の呼び出しが停止します。エントリの値などに対するさらなる編集を認識しなくなったと思います。
lgal Serbanは、これが発生する理由についての裏情報を持っているようです。