tkinter — Как не обрабатывать дальнейший код, если ошибка не исправлена — messagebox.showerror()

#python #tkinter

#python #tkinter

Вопрос:

У меня есть приложение tkinter, где у меня есть метки, записи и кнопка. Всякий раз, когда я нажимаю кнопку, записи передаются в функцию, где они проверяются в соответствии с форматом.

Например —

Два поля — Имя сотрудника, идентификатор сотрудника

Теперь я хочу проверить, начинается ли имя пользователя с «EMP» или нет. Для этого я создал некоторые функции (например, проверяет, буквенно-цифровой код или нет и т.д.). Если имя пользователя не начинается с «EMP», то то, что я делаю сейчас, показывает окно ошибки, подобное этому

 def tracking_images(self,emp_id,emp_name):
    emp_id, emp_name = emp_id.get(), emp_name.get()
    if len(emp_id) == 0:
        tk.messagebox.showerror("Field error", "Employee ID cannot be empty")
    elif len(emp_name) == 0:
        tk.messagebox.showerror("Field error", "Employee name cannot be empty")
    
    if not ValidationConditions().first_three_chars(emp_id):
        tk.messagebox.showerror("Field error", "Employee ID should start with EMP")
    ........
    ........
    #Some more code which I don't want user to have until he/she fixes the error from above checks.  <-------
  

Теперь, после того, как пользователь нажимает «Ок» на любое приглашение, код, к которому я не хочу, чтобы пользователь обращался, все еще обращается.

Как запретить пользователю дальнейшую обработку, пока он не исправит ошибки из вышеуказанных проверок?

Комментарии:

1. Простой способ — добавить return после каждого tk.messagebox.showerror(...) .

2. @acw1668 Но если я не ошибаюсь, это вернет меня к функции, которая вызвала мою функцию «tracking_images», верно? и тогда мне придется добавить туда дополнительные проверки, например, вызывался ли tracking_image раньше или нет, верно?

3. Поскольку у меня нет полной картины вашего дизайна, я просто предоставляю комментарий к вопросу на основе опубликованного кода.

Ответ №1:

Вы могли бы подойти к этому do-while способом (даже если pyhton не поддерживает это семантически)

Псевдокод будет выглядеть следующим образом:

 while True:
    ask the name
    if the name passes the checks break out of the loop
    show errors

code to go to when the name is valid
  

РЕДАКТИРОВАТЬ: я забыл отметить, что, как упоминалось ниже, это должно быть сделано в дополнительном потоке.

Еще одна вещь, которая может сработать, — это поместить диалоги в метод, который вызывает сам себя, если имя недопустимо, для запуска заново.

Но я никогда не пробовал это и не могу проверить, так как я сейчас в пути.

Комментарии:

1. цикл while заморозит приложение tkinter, если вы не предпримете некоторые меры. Вы уверены, что?

2. О, да, вы правы, я забыл упомянуть, что это должно быть в другом потоке или выполняться рекурсивно

3. Я внес некоторые изменения, аналогичные тем, которые вы предложили (с, конечно, некоторыми проверками, чтобы messagebox не застрял в цикле). Это сработало. Спасибо.