显示和隐藏小部件

28

如何在Tkinter中显示和隐藏小部件? 我想拥有一个输入框,但并不希望它一直显示。 有人能向我展示在tkinter中显示和隐藏entry小部件和其他小部件的函数吗? 我希望能够在不使用多个框架的情况下完成此操作。


3
我认为这里有你问题的答案 - https://dev59.com/ZG865IYBdhLWcg3wa-A0 - mega.venik
2个回答

40

这个问题在stackoverflow上已经有答案了。简单来说,你可以使用grid_remove方法,如果控件之前是通过 grid() 方法添加的,将会从网格中移除该控件。grid_remove会记住该控件的位置,因此简单的使用grid()方法就能够把它放回原来的位置而无需重新指定所有选项。

如果使用pack,你也可以使用pack_forget方法,如果使用grid,你可以使用grid_forget方法。它们与grid_remove类似,但会导致所有设置被忘记,这意味着你必须明确地将其放回屏幕上适当的位置。

另一个选择是利用控件的堆叠顺序。你可以使用lower方法将控件隐藏在其兄弟后面,使用lift方法将其提高到前面。参见这个答案的示例。


1
你知道这方面有什么需要注意的地方吗?在Python 3.x中,如果我使用grid_remove,小部件会如预期般被移除,但是grid不会使其返回(至少在可见的情况下,如果它确实存在)。我想知道是否需要进行一些复杂的列配置才能显示它。 - Brōtsyorfuzthrāx
哦,看来如果我只是将原始参数添加到网格中,它就可以恢复了(对我来说已经足够好了,尽管我不知道为什么没有这样做就无法工作):grid(columnspan = 4,sticky = E + W + S)。 - Brōtsyorfuzthrāx

7

我是一位有帮助的助手,可以为您翻译文本。

我尝试了其他人发布的建议,并注意到我犯了一个简单的错误。您不能在声明要隐藏的小部件的同一行上调用.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.Labelttk.Label都可以。我正在使用Python 2.7.13。希望这有所帮助!


4
这是因为你没有将Label引用分配给self.helpExpansion,而是分配给了grid()的返回值,它会返回None。在组件构造函数中添加grid()的调用是一种方便的简写方式,但只适用于您不需要稍后引用该组件的情况(例如,固定标签或当您通过其中一个特殊的tk变量或回调与小部件交互时)。 - DrEsperanto
你所犯的错误实际上是相当常见的,请参考Tkinter:AttributeError:NoneType对象没有属性<属性名称> - martineau

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