为了账号安全,请及时绑定邮箱和手机立即绑定

Python tkinter-删除列表框项和相应的列表项

Python tkinter-删除列表框项和相应的列表项

慕码人2483693 2021-08-05 17:12:26
到目前为止,我有能力从列表框中删除一个或多个列表框项目,但我也希望能够从实际列表中删除那些确切的项目。如果您运行我提供的代码,您将看到它是被删除的相反端列表项。例如,如果我突出显示“14”并将其删除,则从列表中删除的项目是“0”,因为我们的范围是 (0,15)。请看一看,任何反馈表示赞赏。import tkinter as tkclass Example(tk.Tk):    def __init__(self):        tk.Tk.__init__(self)        self.title("Test Runner")        self.geometry("750x500")        self.resizable(width=False, height=False)        self.robot_files_ran_frame = tk.Frame(self)        self.robot_files_ran_frame.place(bordermode=tk.INSIDE, height=30, width=200, y=250, x=35)        self.display_robot_files_frame = tk.Frame(self, borderwidth=1, highlightthickness=1,                                          highlightbackground="black", highlightcolor="black")        self.display_robot_files_frame.place(bordermode=tk.INSIDE, height=200, width=300, y=285, x=50)        self.robot_file_list = tk.Listbox(self.display_robot_files_frame,selectmode=tk.MULTIPLE)        self.robot_file_list.place(bordermode=tk.INSIDE, height=196, width=296)        self.scroll_bar_x = tk.Scrollbar(self.robot_file_list, orient=tk.HORIZONTAL)        self.scroll_bar_x.config(command=self.robot_file_list.xview)        self.scroll_bar_x.pack(fill=tk.X, side=tk.BOTTOM)        self.robot_file_list.config(xscrollcommand=self.scroll_bar_x.set)        self.scroll_bar_y = tk.Scrollbar(self.robot_file_list, orient=tk.VERTICAL)        self.scroll_bar_y.config(command=self.robot_file_list.yview)        self.scroll_bar_y.pack(fill=tk.Y, side=tk.RIGHT)        self.robot_file_list.config(yscrollcommand=self.scroll_bar_y.set)        global some_list        some_list = []        for x in range(0,15):            some_list.append(x)        for y in some_list:            self.robot_file_list.insert(0, y)        self.remove_button = tk.Button(self, text= "Remove", height=2, width=6, command=self.remove_functionality)        self.remove_button.place(x=362, y=350)
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

由于索引的工作方式以及如果您尝试仅从与项目匹配的列表中删除索引将遇到的问题,我认为最好获取列表框中所选项目的显示值,然后从中删除这些项目列表,然后重建列表框。这将阻止列表和收件箱之间的索引匹配。


首先更改some_list为self.some_list使其成为我们稍后可以从类方法访问的类属性。


然后将您的remove_functionality(self)方法更改为以下内容:


def remove_functionality(self):

    sel = self.robot_file_list.curselection()

    to_append = []

    for ndex in sel:

        to_append.append(self.robot_file_list.get(ndex))

    for itm in to_append:

        self.some_list.remove(itm)        

    self.robot_file_list.delete(0,'end')

    for y in self.some_list:

        self.robot_file_list.insert(0, y)

    print(self.some_list)

正如Idlehands指出的那样,上述方法会出现重复项目的问题。


作为可能更好的选择,您可以根据删除项目后列表框中剩余的内容重建列表。


def remove_functionality(self):

    sel = self.robot_file_list.curselection()

    for index in reversed(sel):

        self.robot_file_list.delete(index)


    self.some_list = []

    for item in reversed(self.robot_file_list.get(0, "end")):

        self.some_list.append(item)


    print(self.some_list)


查看完整回答
反对 回复 2021-08-05
  • 1 回答
  • 0 关注
  • 362 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信