如何在tkinter中从网格中删除小部件?

13

我在tkinter框架中有一个网格,用于显示查询结果。其中有一个日期字段需要手动更改,然后将该日期作为查询结果的参数。每次更改日期,显然结果会有所变化并且给出不同数量的行。问题是,如果第二次执行时获得的行数少于第一次,则仍将保留第一次查询结果下面的结果,这会非常困惑。

我的问题是,如何从框架中删除所有行号大于6(无论里面有什么)的行?

顺便说一句,我正在运行Python 3.3.3。谢谢!


请发布一些代码,让我了解您如何设置代码以使响应有意义。 - Amazingred
请参考Brian Oakley在这里的回答(http://stackoverflow.com/questions/11357988/deleting-certain-rows-columns-in-a-grid-tkinter),他的回答基本上已经解决了你所提出的问题,不是吗? - Amazingred
1个回答

24

调用方法grid_forget将从窗口中删除该小部件 - 此示例使用在父级上调用grid_slaves来查找映射到网格的所有小部件, 然后使用grid_info调用了解每个小部件的位置:

>>> import tkinter
# create: 
>>> a = tkinter.Tk()
>>> for i in range(10):
...    label = tkinter.Label(a, text=str(i))
...    label.grid(column=0, row=i)
# remove from screen:
>>> for label in a.grid_slaves():
...    if int(label.grid_info()["row"]) > 6:
...       label.grid_forget()

太棒了!这正是我要找的!不过有一个问题,如果我不知道小部件的名称,我该怎么做呢? - rodrigocf
1
上面的代码片段清楚地展示了这一点:它根本不使用任何 Python 端对小部件的引用,而是通过方法调用来检索小部件及其位置。(当然,您需要一个父小部件的引用) - jsbueno
来自2020年的声音,这仍然是一个非常有效的选择。干得好@jsbueno。 - Slyme
1
grid_forget() 不会移除小部件,它只是隐藏它。如果小部件不断被遗忘/隐藏,然后创建新的小部件,这可能会导致内存泄漏。 - yamex5
确实 - 这个小部件会泄漏 - 但是,我在这里进行了一些实验,使用弱引用来检查小部件是否实际上“消失”,结果似乎它们仍然会泄漏,即使从所有布局管理器中删除,调用“destroy”,当然,删除所有Python端引用。该小部件仍然可以通过弱引用检索。只是不要创建一个应用程序,它创建数百个小部件的列表,并尝试在刷新时杀死它们并创建新的小部件。一周左右后,您的桌面将缺少几个GB。 - jsbueno
抱歉如果这听起来有点被动攻击,我只是无法放弃这个笑话。结论是tkinter应用程序无论如何都会泄漏对象,如果您正在开发一个旨在始终运行应用程序的设备,请记得设置监督程序,在所有情况下适时重新启动它。然而,当然,一个合适的程序也应该调用.destroy()并删除Python侧对任何未重用的小部件的引用。 - jsbueno

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