これは、番号が入力されているかどうかを自動的にチェックする単一のエントリウィジェットを備えた単純な Python/Tkinter プログラムです。
from Tkinter import *
class MyClass:
def __init__(self, parent):
self.myParent = parent
self.portVar = IntVar()
self.portVar.set(111)
port_validator = self.myParent.register(self._validate)
self.myEntry = Entry(self.myParent, width=9, textvariable=self.portVar,
validate='all', validatecommand=(port_validator,'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'))
self.myEntry.pack(side=TOP)
def _validate(self, d, i, P, s, S, v, V, W):
print "OnValidate: d='%s' i='%s' P='%s' s='%s' S='%s' v='%s' V='%s' W='%s'" % (d, i, P, s, S, v, V, W)
return P.isdigit()
root = Tk()
myclass = MyClass(root)
root.mainloop()
_validate() 関数内の print ステートメントはデバッグ専用です。この場合の問題は、エントリのビジュアル編集が正しくないことです。たとえば、次の手順を実行します。
- プログラムを起動します。
- エントリの「111」値を参照してください
- マウスの左ボタンで「111」を選択
- キーボードの「9」を押します
- 「111」を「9」に完全に置き換える代わりに、挿入が行われ、「9111」が表示されます。
デバッグログ (分かりやすいように手順を数えました):
- OnValidate: d='-1' i='-1' P='111' s='' S='' v='all' V='forced' W='.37125736'
- OnValidate: d='-1' i='-1' P='111' s='111' S='' v='all' V='focusin' W='.37125736'
- OnValidate: d='0' i='0' P='' s='111' S='111' v='all' V='key' W='.37125736'
- OnValidate: d='1' i='0' P='9111' s='111' S='9' v='all' V='key' W='.37125736'
- OnValidate: d='0' i='1' P='9' s='9111' S='111' v='all' V='key' W='.37125736'
- OnValidate: d='1' i='1' P='99' s='9' S='9' v='all' V='key' W='.37125736'
- OnValidate: d='1' i='2' P='999' s='99' S='9' v='all' V='key' W='.37125736'
ステップ 4 に注意してください。不要なエントリ テキスト状態 ('9111') を含む奇妙な追加ステップです。
でも私が変われば
return P.isdigit()
に
return True
すべてがOKになります!エントリは、他のプログラムのエントリと同じように機能します。
1. OnValidate: d='-1' i='-1' P='111' s='' S='' v='all' V='forced' W='.37650024'
2. OnValidate: d='-1' i='-1' P='111' s='111' S='' v='all' V='focusin' W='.37650024'
3. OnValidate: d='0' i='0' P='' s='111' S='111' v='all' V='key' W='.37650024'
4. OnValidate: d='1' i='0' P='9' s='' S='9' v='all' V='key' W='.37650024'
5. OnValidate: d='1' i='1' P='99' s='9' S='9' v='all' V='key' W='.37650024'
6. OnValidate: d='1' i='2' P='999' s='99' S='9' v='all' V='key' W='.37650024'
なぜ、みんな?