【问题标题】:tkinter grid_forget methodtkinter grid_forget 方法
【发布时间】: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 - 我是个白痴!很好看!

标签: python tkinter


【解决方案1】:

grid_forget() 方法只会隐藏标签,不会移除标签。

如果要删除标签,请使用destroy()。 现在,如果这里的目标只是更新标签文本,您可以使用 StringVar()

row = 7
step = 0
for k,v in ordnance_database.items():
    name = v
    lbl_text_var = StringVar()
    lbl_text_var.set(name + ": " + str(ship_ordnance[step]))
    label = Label(window, textvariable=lbl_text_var, background=background_colour, foreground="white", font="none 10")
    # Setting text variable as it's own attribute to retrieve it later.
    # a separate list can also be created
    label.lbl_text_var = lbl_text_var
    all_labels.append(label)
    row += 1
    step += 1

现在当你想设置值时

step = 0
for k,v in ordnance_database.items():
    name = v
    lbl_text_var = all_labels[step].lbl_text_var
    lbl_text_var.set(name + ": " + str(ship_ordnance[step]))
    step += 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多