Python tkinter - удалить элемент списка и соответствующий элемент списка - PullRequest
0 голосов
/ 02 ноября 2018

Пока у меня есть возможность удалить один или несколько элементов списка из списка, но я хочу иметь возможность удалять и эти точные элементы из фактического списка. Если вы запустите код, который я предоставил, вы увидите, что это противоположный элемент списка, который удаляется. Например, если я выделю «14» и удалим его, элемент, удаленный из списка, будет «0», поскольку у нас есть диапазон (0,15). Пожалуйста, посмотрите, любые отзывы приветствуются.

import tkinter as tk


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

    def remove_functionality(self):
        sel = self.robot_file_list.curselection()
        # added reversed here so index deletion work for multiple selections.
        for index in reversed(sel):
            self.robot_file_list.delete(index)
            del some_list[index]
            print(some_list)

if __name__ == "__main__":
    Example().mainloop()

1 Ответ

0 голосов
/ 02 ноября 2018

В связи с тем, как работает индексирование, и с какими проблемами вы столкнетесь, если попытаетесь удалить только индекс из списка, соответствующего элементу, я думаю, что было бы лучше получить отображаемые значения элементов, выбранных в списке, а затем удалить эти элементы из списка, а затем восстановить список. Это сохранит соответствие индекса между списком и входящими сообщениями.

Сначала измените 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...