Я перепробовал все, но мой pack_forget не работает в tkinter?

#python #tkinter

#python #tkinter

Вопрос:

Я не знаю почему, но .pack_forget() не работает. Вот код.

 def home():
    home = Frame(root)
    welcome = Label(home, text = 'Welcome!')

    if btn.config('relief')[-1] == 'raised':
        btn.config(relief="sunken")
        home.pack() 
        welcome.pack()
    else:
        btn.config(relief="raised")
        home.pack_forget()
        welcome.pack_forget()
  
 btn = Button(assignmentButtons, text = 'Home', borderwidth = 0, padx = 18, anchor = 'w', activebackground = '#4a4646', activeforeground = '#918787',  relief = RAISED, cursor = 'hand2', command = home)
btn.config(width=25, height=2, bg = '#363333', fg = '#918787')
btn.pack(anchor = 'nw')
  

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

1. Не могли бы вы, пожалуйста, включить полный компилируемый пример?

Ответ №1:

Ваша проблема связана с областью действия. .pack_forget() удаляет home фрейм и welcome метку из поля зрения. Но виджеты, о которых забывают, были только что созданы и никогда .pack не редактировались в первую очередь!

При каждом нажатии btn создается новый фрейм с именем home и новая вызываемая метка welcome . Если btn значение сброса равно "raised" , то эти виджеты упакованы. В противном случае недавно созданные, еще не упакованные виджеты будут забыты (что ничего не дает, потому что они еще не видны). На самом деле вы никогда не ссылаетесь на уже упакованные виджеты. Вам нужно передать ссылку на виджеты, которые были упакованы, чтобы удалить их.

Один из способов сделать это — сгенерировать ваш код tkinter, используя класс с home welcome атрибутами и в качестве созданного класса. Затем вы можете ссылаться на них с self.home.pack_forget() помощью and self.welcome.pack_forget() .

Смотрите Эту ссылку для примера использования определения класса.

Ответ №2:

Я полагаю, что проблема, с которой вы столкнулись, заключается в том, что у вас есть функция и фрейм TK с одинаковыми именами. Попробуйте различать их и посмотреть, поможет ли это. ie. У вас есть «home», указанный как для функции, так и для фрейма, прикрепленного к root