Отображение и скрытие виджетов

Как вы показываете и скрываете виджеты в Tkinter? Я хочу иметь окно ввода, но не показывать его в любое время. Может ли кто-нибудь показать мне функции для отображения и скрытия виджетов и других виджетов в tkinter? Я хочу иметь возможность сделать это, не имея нескольких кадров.

Ответ 1

Об этом было сказано ранее в stackoverflow. Короткий ответ: вы можете использовать grid_remove, из-за чего виджет будет удален, если он был ранее добавлен через сетку. grid_remove запоминает, где был виджет, поэтому простой grid() вернет его без необходимости повторного указания всех параметров.

Вы также можете использовать pack_forget (при использовании пакета) и grid_forget (если используется сетка). Они работают аналогично grid_remove, за исключением того, что они заставляют забыть все настройки, а это означает, что вы должны явно разместить его в нужном месте на экране.

Другой вариант - использовать порядок хранения виджетов. Вы можете использовать метод lower, чтобы скрыть виджет за его родителем, и lift, чтобы поднять его выше. См. этот ответ для примера.

Ответ 2

Я попробовал предложения, которые другие разместили, и заметил, что я делал простую ошибку. Вы не можете вызвать .grid() в той же строке, которую вы объявляете виджет, который вы собираетесь скрыть.

Чтобы уточнить, у меня было это раньше:

self.helpExpansion = ttk.Label(self.helpMenu, text="Expansion Widget").grid(row=1, column=3, sticky=EW)
self.helpExpansion.grid_remove()

Но я получил ошибку AttributeError: 'NoneType' object has no attribute 'grid_remove'. Чтобы исправить это, мне пришлось сделать вызов .grid() в новой строке, например:

self.helpExpansion = ttk.Label(self.helpMenu, text="Help Expansion")
self.helpExpansion.grid(row=1, column=3, sticky=EW)
self.helpExpansion.grid_remove()

Затем, чтобы переключаться между показом и скрытием, я просто чередовался между вызовом self.helpExpansion.grid() (аргументы функции не нужны) и self.helpExpansion.grid_remove().

Для меня это работало как с tk.Label, так и ttk.Label. Я использую Python 2.7.13. Надеюсь, что это поможет!