Top.Mail.Ru
Ответы

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

12345678910111213141516171819202122232425262728293031323334
 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()" не пропускал его и выполнял эту строку, если поможете то всю жизнь буду благодарен

По дате
По рейтингу
Аватар пользователя
Знаток

Тебе нужно сделать переменную answer доступной вне функции vich и проверять её существование перед попыткой удаления.

Попробуй так:

1234567891011121314151617181920212223242526272829303132333435363738
 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) 
 
Аватар пользователя
Ученик

а вот не подскажешь как мне взять переменную answer с условия def vich() на def back() с теми же данными, пробовал глобал, но получилось гомнокод

Аватар пользователя
Знаток

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

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

Аватар пользователя
Знаток

Если подробнее, то это работает так:

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


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

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

Аватар пользователя
Знаток

Возможно, проблема в других частях твоего кода или в инициализации компонентов GUI. Проверь, что все виджеты (a, b, choice-сы и др.) определены и используются



Видео по теме