显示和隐藏小部件

时间:2012-04-22 11:16:08

标签: python user-interface tkinter

如何在Tkinter中显示和隐藏小部件?我想要一个输入框,但不要一直显示它。有人能告诉我在tkinter中显示和隐藏条目小部件和其他小部件的功能吗?我希望能够在没有多个框架的情况下做到这一点。

3 个答案:

答案 0 :(得分:22)

This has been answered before on stackoverflow。简而言之,您可以使用grid_remove,如果之前通过网格添加了小部件,则会导致小部件被删除。 grid_remove会记住窗口小部件的位置,因此简单的grid()会将其放回原位,而无需重新指定所有选项。

您还可以使用pack_forget(如果使用包)和grid_forget(如果使用网格)。这些工作类似于grid_remove,除了它们会导致忘记所有设置,这意味着你必须将它显式地放回到屏幕上的适当位置。

另一种选择是利用小部件的堆叠顺序。您可以使用lower方法隐藏其父级后面的小部件,并使用lift将其提升到上方。有关示例,请参阅this answer

答案 1 :(得分:3)

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

答案 2 :(得分:0)

对于TK网格,我发现这两个辅助函数很有用。首先将小部件的当前状态存储在项目内,然后将其删除。第二个将其添加回网格并恢复状态。

def grid_hide(widget):
  widget._grid_info = widget.grid_info()
  widget.grid_remove()

def grid_show(widget):
  widget.grid(**widget._grid_info)

经过Python 3.8测试。