忘记for循环tkinter创建的小部件

时间:2014-04-02 20:00:17

标签: python widget tkinter

如何忘记忘记由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循环中创建的小部件删除。

此处示例:

更新小部件之前 Before update

更新小部件后 After update

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

修改

我尝试过复制,但它对我不起作用。 我制作了一个清单并确保标签被添加到列表中,它们是。

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()

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

1 个答案:

答案 0 :(得分: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对象的工作方式。