1

我基本上有一个类似的问题,虽然我觉得它没有得到正确的回答:

Tkinter:如何动态创建一个可以被销毁或删除的小部件?

接受的答案是:

您需要将动态创建的小部件存储在列表中。有类似的东西

     dynamic_buttons = []

     def onDoubleClick(event):
     ...
     button = Button(...)
     dynamic_buttons.append(button)
     button.pack() 

You can then access the buttons for removal with, say,

     dynamic_buttons[0].destroy()

你可以看到他们所说的引用是不可变的,这里使用了数字 0。但是当动态创建小部件时,如何将这些引用连接到按钮?

假设您创建了一个顶级小部件(显示文件的内容),并希望有一个按钮来关闭小部件。动态创建将允许打开多个文件。问题是即使有这个列表,按钮如何“知道”它属于哪个小部件,因为没有硬引用(很好,你有一个项目列表,但顶层 5 + 按钮 5 不知道它们是在他们的名单中排名第 5)。按钮和顶层总是只有一个“活动”版本,并且可以删除这个版本。

aanstuur_files = []
aanstuur_frames = []
aanstuur_buttons = []

def editAanstuur():
    openfiles = filedialog.askopenfilenames()
    if not openfiles:
        return 
    for file in openfiles:
        newtop = Toplevel(nGui, height=100, width=100)
        labelTitle = Label(newtop, text=file).pack()
        newButton = Button(newtop, text="save & close", command= ...).pack()
        aanstuur_files.append(file)
        aanstuur_buttons.append(newButton)
        aanstuur_frames.append(newtop)
4

2 回答 2

1

按钮如何知道它属于哪个窗口?你告诉它:

newButton = Button(newtop, command=lambda top=newtop: top.destroy())

顺便说一句,你在你的代码中分配None给。newButton这是因为您正在做newbutton = Button(...).pack(),这意味着newbutton获取的值pack()始终为 None。

如果要保存对小部件的引用,则必须在将小部件放置在窗口中的单独步骤中创建小部件。

更好的解决方案是利用类和对象。创建您自己的 Toplevel 子类,该实例将为您跟踪所有子小部件。例如:

class MyToplevel(Toplevel):
    def __init__(self, parent, filename, *args, **kwargs):
        Toplevel.__init__(self, parent, *args, **kwargs)
        self.filename = filename
        self.savebutton = Button(..., command=self.save)
        ...
    def save(self):
        print "saving...", self.filename
        ...
        self.destroy()
...
openfiles = filedialog.askopenfilenames()
if not openfiles:
    return 
for file in openfiles:
    newtop = MyToplevel(nGui, file, height=100, width=100)
于 2013-07-07T13:11:53.500 回答
0

A使用以下函数将索引传递给您的命令enumerate()函数

def editAanstuur():
    openfiles = filedialog.askopenfilenames()
    if not openfiles:
        return 
    for i, file in enumerate(openfiles):
        newtop = Toplevel(nGui, height=100, width=100)
        labelTitle = Label(newtop, text=file).pack()
        newButton = Button(newtop, text="Save", command=lambda index=i: print(index)).pack()
        aanstuur_files.append(file)
        aanstuur_buttons.append(newButton)
        aanstuur_frames.append(newtop)

确保在定义 lambda 时将索引作为关键字参数传递以绑定值(闭包将使用 的最后一个值i)。

enumerate()接受第二个参数,开始的索引,默认为 0。

于 2013-07-07T12:55:29.460 回答