gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:02:14 24 4
gpt4 key购买 nike

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

enter image description here

由于我不知道用户要选择多少个点,也不知道用户是在选择一个点后立即填写名称 Entry 还是在选择所有点后最后填写名称 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

尽管我知道只需在条目右侧添加另一个按钮来“加载”目标名称即可解决此问题,但我更希望通过单击来完成此操作。但是,我在代码中没有看到我的错误。

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

提前非常感谢。

最佳答案

_update_point_list 会销毁 dynamic_frame,并在第一个 for 循环中将创建的条目附加到 self.entries。因此,您的旧条目(作为动态框架的子项被销毁)仍然在列表中。在 _update_point_list 内的 self.dynamic_frame.destroy() 之后设置 self.entries = [] 应该可以解决您的问题。

来自 effbot 文档:

destroy() [#]Destroys the widget. The widget is removed from the screen, and all resources associated with the widget are released.

关于python - Tkinter:将多个条目小部件保存到列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com