如何删除(或去网格)存储在列表中的Tkinter GUI对象(Python)

时间:2015-12-02 22:50:54

标签: python list object tkinter python-3.4

我试图创建一个程序,在Tkinter中创建一些随机数量的GUI对象并将它们存储在列表中。这里(在下面的代码中)我有一个for循环,它创建了一个随机数量的单选按钮。每次创建单选按钮对象时,它都存储在列表> GUI对象中。我这样做是因为否则我以后无法访问GUI对象。我现在需要知道的是如何删除或去除对象的网格。

我尝试过self.radioButton.grid_forget(),但这只是对最后创建的对象进行了解网格。我不确定是否有办法访问列表中的每个对象并使用.grid_forget()。如果有,那将是一种选择。

现在我需要知道的是在创建所有GUI对象后如何删除或去网格。

from tkinter import *
import random

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.addButton()

    def addButton(self)
        GUIobjects = []

        randInt = random.randint(3, 10)
        self.radVar = IntVar()
        for x in range(2, randInt):
            self.radioButton = Radiobutton(self, text = "Button", variable = self.RadVar, value = x)
            self.radioButton.grid(row = x)

    print(GUIobjects)
    # This is to show that one more object has been created than appears on the screen

    self.radioButton.grid_forget()
    # This de-grid's the last object created, but I need to de-grid all of them

def main():
    a = App()
    a.mainloop()

if __name__ == "__main__":
    main()

截至目前,我尝试在创建所有对象后立即对对象进行网格化。一旦我找到了如何对每个对象进行去网格化,我将以某种方式制作一个按钮来对它们进行去网格化(与在创建它们之后立即去网格化相比)。此按钮应该可以放在" addButtons'以外的方法中。但仍然在应用程序'类。

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要存储对每个对象的引用。创建一个空列表,并将引用附加到循环内的列表中。

self.radioButtons = []
for x in range(2, randInt):
        self.radioButtons.append(Radiobutton(self, text = "Button", variable = self.RadVar, value = x))
        self.radioButtons[-1].grid(row = x) # layout the most recent one

除非你删除引用,否则他们不会被垃圾收集。

for button in self.radioButtons:
    button.grid_forget()
del self.radioButtons