Tkinter - 如何重置对象列表?

时间:2013-03-27 12:27:05

标签: python user-interface tkinter

昨天我问了这个问题Creating elements by loop Tkinter,以了解如何动态创建一些项目符号。现在我想添加一个清除按钮,这样当按下时,将重置整个表单。我已经尝试将列表设置回[]但它没有用。

编辑 - 所以基本上当我按下复位时,我希望它看起来与加载表单时的效果完全一样。

2 个答案:

答案 0 :(得分:4)

使用destroy方法删除按钮:

    for button in self.button:
        button.destroy()

import Tkinter as tk

class ButtonBlock(object):
    def __init__(self, master):
        self.master = master
        self.button = []
        self.button_val = tk.IntVar()
        entry = tk.Entry()
        entry.grid(row=0, column=0)
        entry.bind('<Return>', self.onEnter)
        entry.focus()
        clear_button = tk.Button(master, text='Clear', command=self.onClear)
        clear_button.grid(row=0, column=1)
    def onClear(self):
        for button in self.button:
            button.destroy()
    def onEnter(self, event):
        entry = event.widget
        num = int(entry.get())
        self.onClear()
        for i in range(1, num+1):
            self.button.append(tk.Radiobutton(
                self.master, text=str(i), variable=self.button_val, value=i,
                command=self.onSelect))
            self.button[-1].grid(sticky='WENS', row=i, column=0, padx=1, pady=1)
    def onSelect(self):
        print(self.button_val.get())

if __name__ == '__main__':
    root = tk.Tk()
    ButtonBlock(root)
    root.mainloop()

答案 1 :(得分:2)

重新设置列表(即使用self.button = [])只会清除存储在button变量中的数据。仅此操作未连接到用户界面(UI)。您必须显式删除已创建的窗口小部件对象(通过onEnter方法)。

因此,通过扩展前一个问题的answer,您所寻找的清算功能应该是可行的。向onClear类添加ButtonBlock方法,以便在选择“清除”控件(即使用按钮小部件)时,其回调函数会调用ButtonBlock.onClear(),类似于{{1} widget调用Entry方法。

编辑:请参阅unutbu对此问题的回答。选中后,onEnter控件会调用clear_buttonButtonBlock.onClear()中的for循环从onClear列表中获取对每个按钮ojbect的引用,并调用对象的button方法,该方法将其从UI中删除。