Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show/hide widgets in Tkinter?

Tags:

python

tkinter

I am attempting to create a program that performs a function given a series of user inputs. Several of the user inputs are only necessary under certain circumstances, and I would like to, if possible, only show the Entry boxes and Labels for those input values when a Checkbutton is selected indicating that the circumstances requiring those inputs are present. What I'm not sure how to do is:

  • Put the Labels and Entry boxes I'm adding in between rows that already exist.

  • "Hide" the Labels and Entry boxes when the Checkbutton is deselected, without destroying them, so that they can be displayed again without losing any already-entered data if the Checkbutton is reselected.

    • Example: I select the Checkbutton, enter data into the new boxes that appear, then deselect the Checkbutton (causing the boxes to no longer be displayed). If I were to then reselect the Checkbutton, the data I entered the last time the Checkbutton was selected should still be there.
  • "Show" the same Labels and Entry boxes that had previously been "hidden" if the Checkbutton is reselected after having been previously deselcted.

I don't know if something like this is even possible, but if it's not, please let me know. Also, I am aware that I could simply set the relevant Entry boxes' state to DISABLED while the Checkbutton is deselected, but I would prefer, if possible, that the boxes not appear so that their presence does not confuse users who are not familiar with the circumstances under which the additional inputs are necessary.

If this is relevant, I am using Python 2.7.9, Anaconda 2.2.0 (64-bit), and Tkinter version 81008 on Windows 10 Pro. Feel free to request further information if I've left anything out that would be useful to know. Thanks in advance for any help you're able to provide.

like image 227
train1855 Avatar asked Jun 28 '16 21:06

train1855


1 Answers

I think you want grid_remove().

From http://www.tkdocs.com/tutorial/grid.html:

The "forget" method of grid, taking as arguments a list of one or more slave widgets, can be used to remove slaves from the grid they're currently part of. This does not destroy the widget altogether, but takes it off the screen, as if it had not been gridded in the first place. You can grid it again later, though any grid options you'd originally assigned will have been lost.

The "remove" method of grid works the same, except that the grid options will be remembered.

Ugly example follows. Play with the grid options and the entry text to see how they are preserved.

def toggle_entry():
    global hidden
    if hidden:
        e.grid()
    else:
        e.grid_remove()
    hidden = not hidden

hidden = False
root = tk.Tk()
e = tk.Entry(root)
e.grid(row=0, column=1)
tk.Button(root, text='Toggle entry', command=toggle_entry).grid(row=0, column=0)
root.mainloop()
like image 183
Stop harming Monica Avatar answered Oct 01 '22 17:10

Stop harming Monica