Tkinter:将多个Entry小部件保存到列表

时间:2016-03-29 03:05:25

标签: python tkinter

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

enter image description here

由于我无法知道用户将选择多少分,因此我无法知道用户是在选择一个点之后立即填写名称Entry还是在选择之后所有点,用户按下' CONTINUE'后,将读取Entry小部件中的文本。按钮。

我到目前为止所做的是:每次添加新点时,即每次创建新的Entry小部件时,小部件都会保存到列表中。这是每次添加新点时执行的功能:

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

' CONTINUE'按下按钮时,调用以下功能:

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

即使我知道我可以通过简单地在条目右侧添加另一个按钮来解决这个问题,然后加载"目标名称,我希望只需单击一下即可完成。但是,我没有在代码中看到我的错误。

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

提前多多感谢。

1 个答案:

答案 0 :(得分:2)

_update_point_list销毁dynamic_frame,在第一个for循环中,您将创建的条目追加到self.entries。因此,您的旧条目(作为动态框架的子项销毁)仍在列表中。 <{1}}在self.entries = []内设置self.dynamic_frame.destroy()可以解决您的问题。

来自effbot文件:

破坏()[#] 销毁小部件。窗口小部件将从屏幕中删除,并释放与窗口小部件关联的所有资源。