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位數字和其他字符
編輯:好了,所以我創建了自己的彈出式子窗口,並且驗證仍然會從窗口中消失,可能是因爲主窗口中的焦點丟失導致輸入框中的驗證失效。請任何想法。
你是怎麼調用這個函數的?你使用哪種GUI框架?是否Tkinter? –
嘿PM - 我正在使用tkinter。我已經將該函數的調用包裝爲; 'code'vcmd =(root.register(好的),'%s','%P') –
已更新的原始問題 - 我認爲這是一個重點可能{{ - {{但不知道爲什麼? –