Python Tkinter:将多条目小部件保存到列表时出现问题

Python Tkinter:将多条目小部件保存到列表时出现问题,python,tkinter,Python,Tkinter,我正在开发一个界面,用户可以从显示的图像中选择点。窗口右侧将显示包含选定点的列表。每次用户单击一个点时,列表都会更新以添加新点。列表中的点显示为坐标,坐标旁边有一个条目小部件,用户可以为该特定点指定一个文本标签 由于我不知道用户将选择多少个点,也不知道用户是在选择一个点之后还是在选择所有点之后填写名称条目,因此在用户按下“继续”按钮后,将读取条目小部件中的文本 到目前为止,我一直在做的是:每次添加一个新点,即每次创建一个新条目小部件时,小部件都会保存到列表中。这是每次添加新点时执行的函数: de

我正在开发一个界面,用户可以从显示的图像中选择点。窗口右侧将显示包含选定点的列表。每次用户单击一个点时,列表都会更新以添加新点。列表中的点显示为坐标,坐标旁边有一个条目小部件,用户可以为该特定点指定一个文本标签

由于我不知道用户将选择多少个点,也不知道用户是在选择一个点之后还是在选择所有点之后填写名称条目,因此在用户按下“继续”按钮后,将读取条目小部件中的文本

到目前为止,我一直在做的是:每次添加一个新点,即每次创建一个新条目小部件时,小部件都会保存到列表中。这是每次添加新点时执行的函数:

def _update_point_list(self):
    self.dynamic_frame.pack_forget()
    self.dynamic_frame.destroy()
    self.dynamic_frame = Frame(self.Fpoints)
    self.dynamic_frame.pack()

    for coo, i in zip(self.dynamic_points, range(len(self.dynamic_points))):
        L = Label(self.dynamic_frame, text=str([coo[0], coo[1]]))
        T = Entry(self.dynamic_frame, width=15)
        T.insert(INSERT, "Target name")
        B = Button(
            self.dynamic_frame,
            text='\xe2\x98\x92'.decode('utf8'),
            command=lambda i=i: self._button_remove_point(i))
        L.grid(row=i + 1, column=1)
        T.grid(row=i + 1, column=2)
        B.grid(row=i + 1, column=3)
        print T
        self.entries.append(T)

    if len(self.dynamic_points) > 0:
        self.cont.configure(state=ACTIVE)
        self.label.configure(
            text='\n              Selected points              \n')
    else:
        self.cont.configure(state=DISABLED)
        self.label.configure(
            text='\n            No points selected            \n')
按下“继续”按钮时,调用以下功能:

def _read_data(self):
    for t in self.entries:
        self.labels.append(t.get())
但是,当我运行此操作时,会出现以下错误:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "/media/Fran/dataproc/timeseries/astrointerface.py", line 202, in _read_data
self.labels.append(t.get())
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2475, in get
return self.tk.call(self._w, 'get')
TclError: invalid command name ".140339446529128.140339400493320.140339400493896.140339400493608"
如果我打印“self.labels”,它会显示:

.140339446529128.140339400493320.140339400493896.140339400493608
尽管我知道我可以通过简单地在条目右侧添加另一个按钮来加载目标名称来克服这个问题,但我更希望只需单击一次即可完成。但是,我没有在代码中看到我的错误

我在网站上看到了类似的答案,所有这些答案都使用了将条目小部件添加到列表中的方法,所以我真的不知道这里会发生什么

非常感谢。更新点列表会破坏动态帧,在第一个for循环中,您会将创建的条目附加到self.entries。因此,作为dynamic frame的子项销毁的旧条目仍在列表中。在self.dynamic\u frame.destroy in\u update\u point\u列表后设置self.entries=[]应该可以解决您的问题

来自effbot文档:

销毁[] 销毁小部件。小部件将从屏幕上删除,并释放与小部件关联的所有资源。
所有条目ID已合并为一个字符串->TclError:无效的命令名。140339446529128.140339400493320.140339400493896.140339400493608请仅尝试一个条目,删除_read_数据中的条目内容,然后重新使用相同的小部件。请读取。无效的命令名。xxxxx通常表示您试图调用已删除小部件上的方法。这段代码是在条目小部件被销毁后运行的吗?为了更好地分析您的问题,多些代码会很有帮助。调用_read_data之前和将条目添加到列表之后会发生什么?在获取条目数据之前,请尝试打印t以检查其是否为预期类型。在销毁父帧时,是否也重新初始化条目列表?self.entries=[]在def\u update\u point\u listself中销毁帧后