如何删除未保存的tkinker标签?

时间:2018-01-31 20:04:34

标签: python tkinter grid labels

我制作了这个程序,我将标签放在网格上而不将它们保存在变量中。我这样做是因为我可以遍历一个类列表并从每个类中获取数据并将它们添加到一行中。这是它的一小部分:

self.collum = 0
for i in self.gui_resource_list:
   Label(text=i.get_name(), relief="groove", width=15).grid(column=self.column, row=0)
   Label(text=i.get_buyPrice(), relief="groove", width=15).grid(column=self.column, row=1)
   Label(text=i.get_salePrice(), relief="groove", width=15).grid(column=self.column, row=2)
   Label(text=i.arrow, relief="groove", width=15).grid(column=self.column,row=3)
   self.column += 1

因此,这将生成一个类似于表格的布局。然后有一个按钮更新所有值,再次循环运行。所以它基本上在旧版标签之上绘制新标签。这并不好,因为当你在转弯300时,有{300}标签乘以gui_resource列表中的所有资源实例。解决此问题的方法是删除旧标签。

有没有办法删除未保存的标签?类似的东西:

delete_grid(column=2,row=3) 

这会删除位置2,3的网格中的所有内容吗?

2 个答案:

答案 0 :(得分:1)

您可以要求网格提供其管理的小部件列表。然后,您可以遍历该列表以找出每行和每列中的哪个小部件。

例如,如果您希望能够修改特定行或列中窗口小部件中的文本,则可以执行以下操作:

def set_item_text(master, row, column, text):
    for child in master.grid_slaves():
        grid_info = child.grid_info()
        if grid_info['row'] == row and grid_info['column'] == column:
            child.configure(text=text)

这是一个将第2行第2列中的文本更改为“hello,world”的示例:

import Tkinter as tk

def set_item_text(master, row, column, text):
    for child in master.grid_slaves():
        grid_info = child.grid_info()
        if grid_info['row'] == row and grid_info['column'] == column:
            child.configure(text=text)

root = tk.Tk()

for row in range(4):
    for col in range(5):
        tk.Label(
            root, text="row %s col %s" % (row, col)
        ).grid(row=row, column=col, padx=8)

set_item_text(root, 2,2, "hello, world")

root.mainloop()

您可以轻松删除小部件,但如果您只是想刷新“类似表格的东西”,那么更改数据比删除和重新创建所有小部件更有效。

答案 1 :(得分:1)

from pprint import pprint
from tkinter import Tk, Label

root = Tk()
Label(root, text='MyLabel').pack()
Label(root, text='MyLabel').pack()
Label(root, text='MyLabel').pack()

# as you did not kept references to the labels
# you have to look into the childrens of root

pprint(root.children) # show root children names
print()

root.children['!label2'].destroy() # do what you asked on the second Label
pprint(root.children) # check that it's gone