在python tkinter中,应该如何删除由循环创建的小部件



我通过循环创建了条目和标签。如果用户单击该按钮,将在两行中出现新的条目和标签。现在我想通过点击其他按钮来删除它们,但标签是不可删除的——只有条目是可删除的。

我的另一个问题是,我只想删除最后一个通过单击添加的小部件。为了明确起见:我想通过单击删除最后18-18个标签和条目。目前,到目前为止添加的所有条目都将被删除。标签根本不是。以下是相关代码:

self._1thLabel_list = ['Label1', 'Label2', 'Label3', 'Label4', 'Label5',
'Label6', 'Label7', 'Label8', 'Label9']
self._2thLabel_list = ['Label10', 'Label11', 'Label12', 'Label13', 'Label14', 
'Label15', 'Label16', 'Label17', 'Label18']
nothingList2 = []
self.col = 4
for j in range(len(self._1thLabel_list)):
self.myLab = Label(root, text=self._1thLabel_list[j]).grid(row=0, column=j+1)
for k in range(1):
self.myEntry_loop = Entry(root)
self.myEntry_loop.grid(row=k + 1, column=j+1, pady=10, padx=10)
self.myEntry_loop_2 = Entry(root)
self.myEntry_loop_2.grid(row=k + 3, column=j + 1, pady=10, padx=10)
nothingList2.append(self.myEntry_loop)
nothingList2.append(self.myEntry_loop_2)
for l in range(len(self._2thLabel_list)):
self.myLab_2 = Label(root, text=self.mylist_2[l]).grid(row=2, column=l + 1)
self.myButton_newWidgets = Button(root, text="Add", command=self.Add)
self.myButton_newWidgets.grid(row=self.col, column=4)
self.myButton_deleteWidgets = Button(root, text="Delete", command=self.deleteThem)
self.myButton_deleteWidgets.grid(row=self.col, column=5)

以下是如何删除它们:

def deleteThem(self):
for v in range(18):
nothingList2.pop(0)
for dele in nothingList2:
dele.destroy()  # Here, it is deleting entries but delete all of them. I want just delete the last 18 of them. 
for w in range(9):
self._1thLabel_list.pop(0)
for delet in self._1thLabel_list:
delet.destroy()   # I got "AttributeError: 'str' object has no attribute 'destroy'" error in this line
for x in range(9):
self._2thLabel_list.pop(0)
for delet2 in self._2thLabel_list:
delet2.destroy()

下面是一个解决方案(解释如下(:

from tkinter import Tk, Button

root = Tk()
removable_widget_dict = {}

class RemovableWidget(Button):
def __init__(self, parent, title, key):
Button.__init__(self, parent)
self.key = key
self.config(text=title)
self.pack()
def delete(self):
self.destroy()
removable_widget_dict.pop(self.key)

for i in range(10):
key = f'item{i}'
removable_widget_dict[key] = RemovableWidget(root, f'Button {i}', key)
for key in removable_widget_dict.keys():
if key == 'item5':
removable_widget_dict[key].delete()
break
root.mainloop()

解释:

首先,我想提到的是,这是我在做个人项目时想到的(至少与此类似(,所以所有这些都来自经验,从某种意义上说,这可能不是最好的解决方案,但它确实有效。

在完成tkinter(root = Tk()root.mainloop()(的基本操作后,您将创建一个字典,该字典将在某种程度上存储类。现在类在这里是一个重要的因素,因为类的每个实例都可以独立操作,而函数至少不那么容易实现这一点。

所以,你可以为你需要的任何小部件创建一个类,你可以创建多个小部件的多个类,或者以某种方式将它们合并为一个(不知道这是如何工作的(,但让我们为一种类型的小部件坚持一个类。

在这个类中,你定义了小部件的所有基本内容,但也添加了一个重要的参数"键";。这并不重要,但肯定是必要的,因为你不想在内存中留下未使用的类(不知道技术方面,但imo它可以让一切都更干净,尤其是如果你出于某种原因不得不阅读它[字典](

然后你定义了删除函数,这就是类实例的独立性:对于每个类实例,你可以调用这个函数,它只会影响那个类实例。因此,现在在这个函数中,您将销毁类创建的小部件(在本例中是self.button中的按钮(或多个小部件。然后进入清理部分:全局定义字典,然后删除";键";由于其他原因,该键还使访问类实例变得更容易。

最后一点。您可以访问存储在字典中的类,函数如下:dictionary[key].that_class_function

相关内容

  • 没有找到相关文章

最新更新