как исправить мой код обработки ошибок? (графический интерфейс tkinter)

#python #tkinter

#python #tkinter

Вопрос:

Я разделил передачу ошибок на 3 части (check_black, raise_error, delete_error)

О функциях:

функция check_blank() проверяет, есть ли какие-либо ошибки во входных записях, а функция raise_error() выдает ошибку, добавляя в gridding() метку ошибки. и если ошибка была устранена, функция delete_error() удаляет метку ошибки.

(есть 5 полей ввода и 4 кнопки проверки, а также кнопка «готово») (ошибка должна быть вызвана, если нет ввода для всех 5 записей или хотя бы одна кнопка проверки не была проверена)

это функция check_blanks():

  def checkblanks(self):
    flag = 0

    if not self.Text1.get():   #text.get() and Answer1.get() etc stores input from entry so if there's no entry then it will be empty
        flag = 1
    if not self.Answer1.get():
        flag = 1
    if not self.Answer2.get():
        flag = 1
    if not self.Answer3.get():
        flag = 1
    if not self.Answer4.get():
        flag = 1
    if not self.var.get():    # var.get stores input from check button so if its not checked then there won't be anything stored in var.get()
        flag  = 2

    if flag == 0:     # flag = 0 means no error
        self.ErrorLabel = None

        self.add() #### EDIT ####
        self.delete_error()   
    elif flag == 1 or flag == 2 or flag == 3:   # if flag is 1 or 2 or 3 means there is error
        self.raise_error(flag)
 
  flag 0 = means no errors
 flag 1 = means that there's no input in all 5 entries
 flag 2 = means at least one check button hasn't been checked
 flag 3 = means both above errors occurred
 

это функция raise error_function:

  def raise_errors(self, flag):
    if flag == 1 or flag == 3:
        self.L5.grid_forget()
        self.ErrorLabel = tk.Label(self.frame2, text="Error: Fill all the blanks !", fg='white', bg='red')
        self.ErrorLabel.grid(row=7, column=0, pady=10)
    elif flag == 2:
        self.L5.grid_forget()
        self.ErrorLabel = tk.Label(self.frame2, text="Error: check ✔️ the correct answer ", fg='white', bg='red')
        self.ErrorLabel.grid(row=7, column=0, pady=10)
 

и функция delete_error:

    def delete_error(self):
    if self.ErrorLabel is not None:   # checks if the error label exists  
        self.ErrorLabel.grid_forget()
 

но есть проблема:

Когда возникает ошибка, а затем создается метка ошибки; после устранения ошибок метка ошибки не удаляется с помощью delete_error()

и иногда несколько меток ошибок перекрывают друг друга, и это не очень эффективно

Мне нужно сделать функции обработки ошибок более простыми и работать должным образом.

Редактировать:

также функция add() вызывается, если flag == 0, (если ошибок нет) функция add() просто создает новый фрейм с теми же записями и проверяет кнопки его и проверяет наличие ошибок снова и снова.

это просто повторяющийся цикл

это та функция:

     def add(self):
        self.X  = 1 
        self.frame2.grid_forget()    # deleted main frame
        self.amount_of_questions -= 1
        self.question(self.X)      # question() creates new frame with same widgets
 

Ответ №1:

Это над написанием каждой метки, потому что вы создаете новую метку для каждого вызова функции и так далее, поэтому я думаю, что сейчас нам безопасно избавиться от None нее и попытаться использовать config :

 def checkblanks(self):
    flag = 0
.....

    self.ErrorLabel = tk.Label(self.frame2,fg='white',bg='red') # Define the variable with basic base options
    if flag == 0:
        self.delete_error()   
    elif flag == 1 or flag == 2 or flag == 3:
        self.raise_error(flag)
 

и тогда delete_error() было бы:

 def delete_error(self):
    self.ErrorLabel.grid_forget() # Now always errorlabel is defined, you might want to use winfo_exists
 

Итак, теперь вам нужно использовать config для обновления виджета внутри raise_errors() :

 def raise_errors(self, flag):
    if flag == 1 or flag == 3:
        self.L5.grid_forget()
        self.ErrorLabel.config(text="Error: Fill all the blanks !") # Update the widget
        self.ErrorLabel.grid(row=7, column=0, pady=10) # Grid it
    elif flag == 2:
        self.L5.grid_forget()
        self.ErrorLabel.config(text="Error: check ✔️ the correct answer ") # Update the widget
        self.ErrorLabel.grid(row=7, column=0, pady=10) # Grid it
 

Поскольку у меня нет кода, чтобы протестировать это, это основано на воображении, я думаю, вам winfo_exists delete_errors() тоже нужно внутри.

после устранения ошибок метка ошибки не удаляется с помощью delete_error()

Это может быть связано с тем , что способ self.ErrorLabel был определен как None . Теперь, когда он всегда определяется как a Label , все должно быть в порядке.

РЕДАКТИРОВАТЬ: Можете ли вы попробовать переместить метку внутрь __init__ :

 def __init__(self):
    ....

    self.ErrorLabel = tk.Label(self.frame2,fg='white',bg='red')
 

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

1. это работает, но 2-я метка ошибки (флаг == 2) не удаляется при устранении ошибки, также я внес небольшую правку о вызове другой функции.

2. @coder_not_found Как происходит flag изменение, как он узнает, что ошибка устранена?

3. @coder_not_found Используйте print() и узнайте, доходит ли выполнение кода внутрь delete_error() или оно входит elif в триггеры and raise_errors()

4. @coder_not_found Попробуйте отредактированную версию, убедитесь, что вы удалили ее check_blanks() и поместили внутрь __init__ .

5. @coder_not_found Хммм, entryname.delete(0,'end') .