#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 не застрял в цикле). Это сработало. Спасибо.