【发布时间】:2022-01-23 23:03:34
【问题描述】:
单击提交按钮后,我正在创建的程序会使用新数据更新页面,在提交按钮的函数中,它会创建标签(其中 8 个)。
row = 7
step = 0
for k,v in ordnance_database.items():
name = v
label = Label(window, text=(name + ": " + str(ship_ordnance[step])),
background=background_colour, foreground="white", font="none 10")
label.grid(row=row, column=0, sticky=W, columnspan=2)
all_labels.append(label)
row += 1
step += 1
再次单击提交按钮时,它会创建新标签,但之前的标签仍然存在。在参考资料中进行了一些谷歌搜索和搜索后,我发现了这一点: How to remove widgets from grid in tkinter? 并在提交按钮的功能中添加了这个:
for labels in window.grid_slaves():
if 7 < int(labels.grid_info()["row"]) < 15 and int(labels.grid_info()["column"]) == 0:
labels.grid_forget()
else:
pass
我想清除行值为 7 到 14 和第 0 列的网格的内容。
我尝试添加 window.update() 但这没有任何区别。
我已经确认到 labels.grid_forget() 是使用 print() 触发的,但它实际上并没有从屏幕上清除它们。
我也尝试过使用.configure - 类似这样的
labels.configure(text="Loading")
但没有快乐。
以下是显示问题的程序的屏幕截图。点击第二个按钮可以看到“Homing: 8”隐藏了之前的数据。
【问题讨论】:
-
您必须隐藏标签并创建新标签吗?或者你只需要更新标签的文本?
-
您说您要清除第 7 到 14 行,但您的代码实际上清除了第 8 到 14 行...“Homing”标签在第 7 行的任何可能性,并且恰好是只留下一个?请注意,
.grid_forget()无论如何都不是您想要的,因为它将所有旧的小部件留在内存中以供可能重用 - 您想要.destroy()。 -
您是否考虑过在创建小部件时打印出它们的名称,然后打印出您要删除的小部件的名称,以查看这两个小部件列表是否是一样吗?
-
如果总是有 8 个标签,那么您应该能够创建它们一次并使用它们的
configure()方法根据需要多次更新它们的外观。如果您尝试过但没有成功,那么您做错了 - 但是您当前的问题不足以让任何人确定如何解决它。请edit您的问题提供minimal reproducible example。 -
@jasonharper - 我是个白痴!很好看!