0

これは、番号が入力されているかどうかを自動的にチェックする単一のエントリウィジェットを備えた単純な 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 ステートメントはデバッグ専用です。この場合の問題は、エントリのビジュアル編集が正しくないことです。たとえば、次の手順を実行します。

  1. プログラムを起動します。
  2. エントリの「111」値を参照してください
  3. マウスの左ボタンで「111」を選択
  4. キーボードの「9」を押します
  5. 「111」を「9」に完全に置き換える代わりに、挿入が行われ、「9111」が表示されます。

デバッグログ (分かりやすいように手順を数えました):

  1. OnValidate: d='-1' i='-1' P='111' s='' S='' v='all' V='forced' W='.37125736'
  2. OnValidate: d='-1' i='-1' P='111' s='111' S='' v='all' V='focusin' W='.37125736'
  3. OnValidate: d='0' i='0' P='' s='111' S='111' v='all' V='key' W='.37125736'
  4. OnValidate: d='1' i='0' P='9111' s='111' S='9' v='all' V='key' W='.37125736'
  5. OnValidate: d='0' i='1' P='9' s='9111' S='111' v='all' V='key' W='.37125736'
  6. OnValidate: d='1' i='1' P='99' s='9' S='9' v='all' V='key' W='.37125736'
  7. 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'

なぜ、みんな?

4

1 に答える 1

0

これP.isdigit()は、コンテンツを数字に制限しているためです。111 を 9 に置き換えると、エントリの内容が空文字列になるステップがあります。は false であるため''.isdigit()、ウィジェットは常に数字をコンテンツとして保持します。この制約を削除すると、任意の文字列が許可され、値を完全に置き換えることができます。

于 2013-02-23T15:14:43.913 に答える