【问题标题】:Forgetting a widget created by a forloop tkinter忘记由 for 循环 tkinter 创建的小部件
【发布时间】:2014-04-02 20:00:16
【问题描述】:

我将如何忘记由for 循环创建的小部件?

例如,我这里有这段代码:

for getSong in a.findAll('name'):
        z += 1
        x += 1
        if z == 11:
            break
        else:
            text = ''.join(getSong.findAll(text=True))
            data = text.strip()
            songLab = Label(frame1, text=data)

之后,用户按下Button 并更新小部件,如下所示:

def update():
    try:
        openArtist.pack_forget()
        artistLab.pack_forget()
        songLab.pack_forget()
        getScrobbledTracksArtist()
    except NameError:
        getScrobbledTracksArtist()

for 循环中创建的小部件不会删除其他小部件。

这里的例子:

更新小部件之前

更新小部件后

如您所见,只删除了一行小部件。

编辑

我尝试复制,但它不适合我。 我制作了一个列表,并确保将标签添加到列表中。

labels = []
for getSong in a.findAll('name'):
    z += 1
    x += 1
    if z == 11:
        break
    else:
        text = ''.join(getSong.findAll(text=True))
        data = text.strip()
        songLab = Label(frame1, text=data)
        labels.append(songLab)
        songLab.pack()

然后在按下Button 后,小部件会更新。

def update1():
try:
    openArtist.pack_forget()
    artistLab.pack_forget()
    labels[0].destroy()
    print labels
    getScrobbledTracksArtist()
except NameError:
    getScrobbledTracksArtist()

标签仍在列表中,没有被销毁。

【问题讨论】:

  • @BryanOakley 这不起作用,所以我认为它不是重复的。
  • 如果它对您不起作用,那么您做错了。这里没有魔法:您需要一个小部件的引用才能删除或移除它。这不是 tkinter 问题,而是对象的工作方式。要在对象上调用方法,您需要对该对象的引用。列表是保存引用的完全可接受的地方。
  • @BryanOakley 我已经更新了我的问题,请看一下。
  • “标签仍在列表中,没有被销毁”——这种说法没有多大意义。一方面,您只是破坏了第一个标签,而不是所有标签。其次,一旦您销毁标签,您仍然需要将其从列表中删除。

标签: python widget tkinter


【解决方案1】:

与任何其他小部件一样,您只需要保留对它的引用即可。例如,您可以将每个小部件附加到列表中,然后遍历列表以删除小部件。

让我们看看这段代码:

def update1():
    try:
        openArtist.pack_forget()
        artistLab.pack_forget()
        labels[0].destroy()
        print labels
        getScrobbledTracksArtist()
    except NameError:
        getScrobbledTracksArtist()

您只是删除列表中的第一个标签,然后您无法将其从列表中删除。相反,您需要做的是遍历列表,销毁每个小部件。然后你可以重新初始化列表:

for label in labels:
    label.destroy()
labels = []

但是,您还有另一个问题,labels 可能是一个局部变量。您需要将其声明为全局,以便两个不同的函数能够访问和修改列表。

这些都与 tkinter 无关,这只是所有 python 对象的工作方式。

【讨论】:

  • 您能再解释一下吗?或者,你的意思是像this? 这样的话,那对我不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多