#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