2016-03-05 102 views
1

我不明白爲什麼messagebox(或simpledialog)打破以下代碼的流程。代碼基本上驗證了Python 3.5中的輸入框。它檢查該字段只包含數字值,並且不超過9位數字,但輸入框可以爲空。向用戶添加消息後,他們確定,允許輸入框超過9位數字,並接受信件,當然我不希望它做。messagebox停止驗證

from tkinter import * 
from tkinter import simpledialog 
from tkinter import messagebox 
root = Tk() 


root.title("Zebra") 
root.update_idletasks() 
root.geometry("350x200+600+300") 
root.config(bg="blue") 

def okay(old,new): #,c,d,e,f,g,h): 

    try: 
     x = int(new) 
    except ValueError as ex: 
     if len(new) == 0: 
      return True 
     else: 
      return False 
    else: 

     if len(new) > 9: 
      messagebox.showerror("Error","Entry is too long") 
      # When messagebox is removed or commented out all is working ok 
      # but add below line and BINGO it works again :-) 

      txtNorm.config(validate='all', vcmd=vcmd) 
      # New line above as of 08/03/2016 brings validation back. 
      return False 

     elif len(new) <=9: 
      return True 
    finally: 

     if len(new) > 9: 

      return False 


     pass 
def txtNormToggle(event): # When the user double clicks the field to enter or correct a number. 
    txtNorm.config(state="normal") 
def txtNormFinished(a): 
    txtNorm.config(state="disabled") 
    root.focus() 

vcmd=(root.register(okay),'%s','%P') 


txtNorm = Entry(root) 
txtNorm.grid(row=1, column=1,padx=(15,15),pady=(15,15), sticky=E+W) 
txtNorm.insert(0,"123") 
txtNorm.config(state="disabled", justify="center", validate='all', vcmd=vcmd) 
txtNorm.bind('<Button>',txtNormToggle) 
txtNorm.bind('<Control-z>',txtNormFinished) 
txtNorm.bind('<Escape>',txtNormFinished) 
txtNorm.bind('<Return>',txtNormFinished) 


root.mainloop() 

沒有消息框上面停比的數字,這是我希望其他用戶輸入任何內容,有消息框一次OK點擊輸入字段允許超過9位數字和其他字符

編輯:好了,所以我創建了自己的彈出式子窗口,並且驗證仍然會從窗口中消失,可能是因爲主窗口中的焦點丟失導致輸入框中的驗證失效。請任何想法。

+0

你是怎麼調用這個函數的?你使用哪種GUI框架?是否Tkinter? –

+0

嘿PM - 我正在使用tkinter。我已經將該函數的調用包裝爲; 'code'vcmd =(root.register(好的),'%s','%P') –

+0

已更新的原始問題 - 我認爲這是一個重點可能{{ - {{但不知道爲什麼? –

回答

0

我已經在(okay)函數的輸入框中添加了驗證,但它並沒有向我解釋爲什麼驗證失敗。代碼現在如何工作