Showing and Hiding widgets

This has been answered before on stackoverflow. The short answer is, you can use grid_remove which will cause the widget to be removed if it was previously added via grid. grid_remove remembers where the widget was, so a simple grid() will put it back without having to re-specify all of the options.

You can also use pack_forget (if using pack) and grid_forget (if using grid). These work similarly to grid_remove except they cause all of the settings to be forgotten, which means you have to explicitly place it back into the proper place on the screen.

Another option is to take advantage of the stacking order of widgets. You can use the lower method to hide the widget behind its sibling, and lift to raise it above. See this answer for an example.


I tried the suggestions that others have posted and noticed that I was making a simple mistake. You can't call .grid() on the same line that you declare the widget that you're going to hide.

To clarify, I previously had this:

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

But I got the error AttributeError: 'NoneType' object has no attribute 'grid_remove'. To fix it, I had to make the call to .grid() on a new line, like this:

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

Then to toggle between showing and hiding, I just alternated between calling self.helpExpansion.grid() (function arguments not needed) and self.helpExpansion.grid_remove().

For me it worked with both tk.Label or ttk.Label. I'm using Python 2.7.13. Hope that helps!