如何在Tkinter中显示/隐藏小部件?

8
我正在尝试创建一个程序,根据一系列用户输入执行功能。在某些情况下,只有在特定条件下,才需要几个用户输入值,并且如果可能的话,我希望仅在选择了Checkbutton(指示需要这些输入的情况存在)时显示标签和输入框。 我不确定如何做到以下几点:
  • 将我添加的标签和输入框放置在已经存在的行之间。

  • 在未选择Checkbutton的情况下“隐藏”标签和输入框,而无需将它们destroy,以便如果重新选择Checkbutton,则可以再次显示,而无需丢失任何先前输入的数据。

    • 例如:我选择了Checkbutton,在新出现的输入框中输入数据,然后取消选择Checkbutton(导致输入框不再显示)。如果我随后重新选择Checkbutton,则我上次选择Checkbutton时输入的数据应该还在。
  • 如果在以前取消选择Checkbutton后重新选择Checkbutton,则“显示”以前已经“隐藏”的相同标签和输入框。

我不知道是否可能实现这样的功能,但如果不可能,请告诉我。另外,我知道我可以简单地将相关输入框的状态设置为DISABLED,而不选择Checkbutton时,但如果可能的话,我希望输入框不显示,因此它们的存在不会困惑不熟悉需要额外输入的情况的用户。
如果这是相关的话,我使用的是Python 2.7.9,Anaconda 2.2.0(64位)和Windows 10 Pro上的Tkinter版本81008。如果我忘记了任何有用的信息,请随时要求更多信息。非常感谢您提供的任何帮助。
1个回答

14

我认为你需要使用grid_remove()方法。

http://www.tkdocs.com/tutorial/grid.html中提到:

grid的"forget"方法接受一个或多个从属小部件的列表作为参数,可用于将从属小部件从它们当前所在的网格中移除。这不会完全销毁小部件,而是将其从屏幕上删除,就好像它一开始并没有被放置在网格中。您稍后可以重新放置它,尽管您最初指定的任何网格选项都将丢失。

grid的"remove"方法与"forget"相同,不同之处在于网格选项将被记住。

以下是一个简单的例子。通过调整网格选项和输入文本来看看它们是如何保留的。

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()

好的,到目前为止还是有道理的。我该如何将已删除的小部件添加回网格中呢?我需要在它们上面调用 .grid() 方法吗? - train1855
是的,看这个例子。我认为其他网格管理器(如pack)也有类似的方法。 - Stop harming Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接