#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
в триггеры andraise_errors()
4. @coder_not_found Попробуйте отредактированную версию, убедитесь, что вы удалили ее
check_blanks()
и поместили внутрь__init__
.5. @coder_not_found Хммм,
entryname.delete(0,'end')
.