メッセージボックス (または単純なダイアログ) が次のコードの流れを中断する理由がわかりません。このコードは、基本的に python 3.5 のエントリ ボックスを検証します。フィールドに数値のみが含まれていること、および長さが 9 桁を超えていないことを確認しますが、入力ボックスは空でもかまいません。ユーザーがOKした後にメッセージを追加すると、入力ボックスを9桁以上にすることができ、文字を受け入れることができますが、もちろん私はそうしたくありません。
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 桁以上の数字とその他の文字を使用できます。
編集:わかりましたので、独自のポップアップ子ウィンドウを作成しましたが、検証はまだウィンドウから出ています。メインウィンドウからのフォーカスの喪失と関係があると思われます。入力ボックスからの検証を強制終了します。アイデアをください。