2013-02-21 24 views
0

這裏是簡單的Python/Tkinter程序與單個Entry小部件,我想自動檢查是否輸入號碼。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()函數中打印語句用於調試。 問題是在這種情況下Entry的可視化編輯是不正確的。 例如,我正在執行這些步驟:

  1. 啓動程序。
  2. 見「111」在鍵盤上輸入
  3. 選擇「111」通過鼠標左鍵
  4. 按「9」,而不是完整
  5. 替換「111」到「9」的插入值恰好,我看到'9111'!

調試日誌(ⅰnumerated爲舒適步驟):

  1. 的OnValidate:d = ' - 1' I = ' - 1' P = '111' S = '' S = '' V = '所有' V = '被迫' W =
  2. 的OnValidate:d = ' - 1' I = ' - 1' P = '111' S = '111' S = '' V = '全部' 37125736' 。 'V =' 的focusIn' W = '37125736'
  3. 的OnValidate:d = '0' I = '0' P = '' S = '111' S = '111' V = '全部' V =' 鍵'W ='。37125736'
  4. OnValidate:d ='1'i ='0'P ='9111' s ='111'S ='9'v = '所有' V = '鍵' W =」 37125736' 。
  5. 的OnValidate:d = '0' I = '1' P = '9' S = '9111' S = '111' V = '全部' v = '鑰匙' W =
  6. 的OnValidate '37125736' :d = '1' I = '1' P = '99' S = '9' S = '9' v = '所有' v =' 鍵'W =' 37125736'
  7. 的OnValidate:d = '1' I = '2' P = '999' S = '99' S = '9' v = '所有' v = '鍵' W =」 0.37125736'

注重步驟4。它是不需要輸入的文本狀態陌生的附加步驟(‘9111’)

但如果我改變

return P.isdigit() 

return True 

一切都變得美好!條目像其他程序中的任何條目一樣工作。

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' 

爲什麼,夥計們?

回答

0

這是因爲與P.isdigit()您被限制的內容是數字。將111替換爲9時,會有一個步驟,其中條目的內容爲空字符串。由於''.isdigit()爲false,所以小部件總是保留一個數字作爲其內容。刪除此限制可以允許任何字符串,然後您可以完全替換該值。