Окно сообщения останавливает проверку

Я не понимаю, почему окно сообщения (или simpledialog) нарушает поток следующего кода. Код в основном проверяет поле ввода в Python 3.5. Он проверяет, что поле содержит только числовые значения и что оно не превышает 9 цифр, однако поле ввода может быть пустым. Добавление сообщения пользователю после того, как он его оканчивает, позволяет вводить в поле ввода более 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()

Приведенное выше без окна сообщения не позволяет пользователю вводить что-либо, кроме цифр, что я хочу, с окном сообщения после нажатия кнопки ОК поле ввода может содержать более 9 цифр и других символов.

edit: хорошо, поэтому я создал свое собственное всплывающее дочернее окно, и проверка все еще выходит за пределы окна, подозреваю, что это как-то связано с потерей фокуса из главного окна, убивая проверку из поля ввода. Любые идеи, пожалуйста.

1 ответ

Я добавил валидацию обратно в поле ввода в (хорошо) функции, она не объясняет мне, почему происходит потеря валидации. Код теперь работает так, как я хотел

Другие вопросы по тегам