Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с удалением сообщения в Python

Арбуз Знаток (315), на голосовании 11 месяцев назад
 def click1():  
a = Entry(window, width=10)
b = Label(window, text="— одна сторона")
a.place(x=220, y=20)
b.place(x=290, y=21)
choice1.configure(state=DISABLED)
choice2.configure(state=DISABLED)
choice3.configure(state=DISABLED)
choice5.configure(state=DISABLED)
choice6.configure(state=DISABLED)

def vich():
vil_a = int(a.get())
c = vil_a ** 2
answer = Label(window, text='Ответ: ' + str(c), font=("Arial Bold", 30))
answer.place(x=220, y=180)

choice4 = Button(window, text="Вычислить", command=vich)
choice4.place(x=219, y=45)

def back():
a.destroy()
b.destroy()
choice4.destroy()
back.destroy()
answer.destroy()
choice1.configure(state=ACTIVE)
choice2.configure(state=ACTIVE)
choice3.configure(state=ACTIVE)
choice5.configure(state=ACTIVE)
choice6.configure(state=ACTIVE)

back = Button(window, image=photo4, text="Назад", command=back, compound=RIGHT)
back.place(x=0, y=150)
Там есть переменная "answer", она должна удалятся в условий "def back()", но допустим
я не нажал на кнопку вычислить(choice4) - по которой она должна появляться и мне вывело ошибку, и окно закрылось, как мне сделать так что бы условие "def back()" пропускал строку "answer.destroy()" и не выводила ошибку, а когда я нажимал вычислить(choice4) то условие "def back()" не пропускал его и выполнял эту строку, если поможете то всю жизнь буду благодарен
Голосование за лучший ответ
Chudo_Chudnoe Мастер (2187) 1 год назад
Тебе нужно сделать переменную answer доступной вне функции vich и проверять её существование перед попыткой удаления.

Попробуй так:
 def click1(): 

# Инициализируем переменную answer как None, чтобы она была доступна глобально внутри click1
answer = None

def vich():
nonlocal answer # Указываем, что answer находится в окружающей области видимости
vil_a = int(a.get())
c = vil_a ** 2
# Удаляем старую метку ответа, если она существует
if answer:
answer.destroy()
answer = Label(window, text='Ответ: ' + str(c), font=("Arial Bold", 30))
answer.place(x=220, y=180)

choice4 = Button(window, text="Вычислить", command=vich)
choice4.place(x=219, y=45)

def back():
nonlocal answer # Снова указываем, что answer находится в окружающей области видимости
a.destroy()
b.destroy()
choice4.destroy()
back.destroy()
# Удаляем метку ответа, только если она была создана
if answer:
answer.destroy()
# Возвращаем кнопки в исходное состояние
choice1.configure(state=ACTIVE)
choice2.configure(state=ACTIVE)
choice3.configure(state=ACTIVE)
choice5.configure(state=ACTIVE)
choice6.configure(state=ACTIVE)


back = Button(window, image=photo4, text="Назад", command=back, compound=RIGHT)
back.place(x=0, y=150)
АрбузЗнаток (315) 1 год назад
а вот не подскажешь как мне взять переменную answer с условия def vich() на def back() с теми же данными, пробовал глобал, но получилось гомнокод
Chudo_ChudnoeМастер (2187) 1 год назад
Этот код уже настроен для использования переменной answer в обеих функциях vich и back через использование ключевого слова nonlocal.
Это позволяет обеим функциям обращаться к одной и той же переменной answer, которая определена в функции click1

nonlocal используется для объявления переменных, которые не являются ни локальными в текущей функции, ни глобальными в модуле, но находятся в промежуточной области видимости, то есть в области видимости окружающей функции. Это то что тебе нужно для переменной answer.
Chudo_ChudnoeМастер (2187) 1 год назад
Если подробнее, то это работает так:

Переменная answer инициализируется как None в функции click1, что делает её доступной во вложенных функциях vich и back.


В функции vich, ты используешь nonlocal answer для указания, что переменная answer находится в окружающей области видимости. Здесь ты изменяешь answer, создавая новый виджет Label и размещая его в окне.

Как и в функции back ты снова указываешь nonlocal answer. Здесь ты можешь проверять, существует ли виджет answer и удалять его при необходимости.
Chudo_ChudnoeМастер (2187) 1 год назад
Возможно, проблема в других частях твоего кода или в инициализации компонентов GUI. Проверь, что все виджеты (a, b, choice-сы и др.) определены и используются
Похожие вопросы