una recorrer obtener mostrar lista eliminar elementos elemento crear agregar actualizar c# python list tkinter listbox

recorrer - obtener elemento de una lista c#



Eliminar elementos seleccionados del cuadro de lista y de la lista (1)

Para mis listboxes, generalmente tengo el modo establecido en EXTENDED para que los usuarios puedan seleccionar uno o más elementos y eliminarlos todos a la vez. Lo hago a través del siguiente método:

# Function with Tk.Listbox passed as arg def remove_from(list_box): # Tuple of currently selected items in arg selected_items = list_box.curselection() # Initialize a ''repositioning'' variable pos = 0 for item in selected_items: # Set index of each item selected idx = int(item) - pos # Deletes only that index in the listbox list_box.delete(idx, idx) # Increments to account for shifts pos += 1

Por ejemplo, digamos que en mi listbox tenía 4 elementos. Luego selecciono el primer elemento y el tercer elemento. Al llamar a list_box.curselection() recibí lo siguiente:

selected_items = (0, 2)

Donde 0 es la posición del primer elemento en el cuadro de lista, y 2 es la posición del tercer elemento. Luego, para cada elemento de mi tupla, establezco su índice.

Al pasar por esto, para el primer elemento, tiene lugar lo siguiente:

idx = 0 - 0 list_box.delete(0, 0) pos = 1

¡Así que ahora borré el artículo en la posición 0 (por ejemplo, el primer elemento) y mi listbox cambió! Entonces, el segundo es ahora el primero, el tercero es el segundo y el cuarto es el tercero. Sin embargo, mi tupla no ha cambiado ya que eran las posiciones en el cuadro de lista de la selección original . Esta es la clave. Lo que sucede a continuación es:

idx = 2 - 1 list_box.delete(1, 1) pos = 2

Dado que el cuadro de lista se desplazó, la posición 1 ahora corresponde al elemento que originalmente estaba en la tercera posición del cuadro de lista. Esto puede continuar para n posiciones.

Para la eliminación de self.words

Podrías probar lo siguiente:

# Function with Tk.Listbox and self.words[] passed as args def remove_from(list_box, list): # Tuple of currently selected items in arg selected_items = list_box.curselection() # List of Words already constructed word_list = list # Initialize a ''repositioning'' variable pos = 0 for item in selected_items: # Set index of each item selected idx = int(item) - pos # Deletes only that index in the listbox list_box.delete(idx, idx) # Gets the string value of the given index word = list_box.get(idx, idx) # Removes the word from the list if any(word in x for x in word_list): word_list.remove(word) # Increments to account for shifts pos += 1

Tengo una aplicación escrita en C # que debe convertirse a Python, ya que recientemente cambié a Linux. Es una aplicación GUI simple para administrar palabras desconocidas mientras se aprende un nuevo idioma. Sin embargo, necesito la función remove_item () para la cual también necesito la función find_word () .

En C #, crearía dos métodos siguientes:

void Remove() { Word word = new Word(); try { word = FindWord(listView1.SelectedItems[0].Text); } catch { return; } if (listView1.SelectedItems.Count > 0) { try { foreach (ListViewItem eachItem in listView1.SelectedItems) { words.RemoveAll(x => x.WordOrPhrase == eachItem.Text); listView1.Items[listView1.Items.Count - 1].Selected = true; listView1.Items.Remove(eachItem); } } catch { } ClearAll(); ReadOnlyON(); } else { MessageBox.Show("You have not selected any words!", "Notification", MessageBoxButtons.OK, MessageBoxIcon.Information); } ReadOnlyOFF(); WordCount(); Sync(); } private Word FindWord(string word) { return words.Find(x => x.WordOrPhrase == word); }

... pero todavía soy un novato cuando se trata de Python, por lo que cualquier ayuda sería apreciada. Esto es lo que tengo hasta ahora:

Cuando se trata del método FindWord (), podría reescribirse de la siguiente manera:

def FindWord(word): for x in words: if x.WordOrPhrase == word: return x

o

def FindWord(word): return next((x for x in words if x.WordOrPhrase == word), None)

o

def FindWord(word): return next(filter(lambda x: x.WordOrPhrase == word, words), None)

... pero estoy luchando por volver a escribir el método Remove (). Aquí hay una manera:

def remove_item(self): word = self.listBox.get(ACTIVE) new_word_list = [] # initialize empty list delete_idxs = [] for idx, item in enumerate(self.words): if item.wordorphrase == word: delete_idxs.append(idx) else: new_word_list.append(item) self.words = new_word_list # overwrite the old word_list with the new one for idx in reversed(delete_idxs): self.listBox.delete(idx)

... lo que más me gustaría es convertir mi método C # a Python. Esto es lo que tengo hasta ahora:

def remove_item(self): word = Word() try: word = find_word(self.listBox.curselection()) except: return if self.listBox.len(curselection()) > 0: try: for item in self.listBox.curselection(): self.words.remove(lambda x: x.wordorphrase == item.text) # listView1.Items[listView1.Items.Count - 1].Selected = true; self.listBox.remove(item) except: pass self.clear_all() else: pass # show messagebox

No sé cómo acceder:

  • listView1.SelectedItems[0].Text
  • listView1.SelectedItems.Count > 0
  • listView1.SelectedItems
  • listView1.Items[listView1.Items.Count - 1].Selected

Esto es lo que he hecho hasta ahora:

# Vocabulary.py # GUI program to manage unknown words from tkinter import * from tkinter import ttk from tkinter import messagebox import xml.etree.ElementTree as ET import os class Word: def __init__(self, wordorphrase, explanation, translation, example): self.wordorphrase = wordorphrase self.explanation = explanation self.example = example self.translation = translation class Vocabulary(Frame): def __init__(self, master): Frame.__init__(self, master) self.master = master self.master.resizable(width = False, height = False) self.master.title("Vocabulary") self.create_widgets() self.words = [] self.load_words() def on_closing(self): self.save_all() if messagebox.askokcancel("Quit", "Do you want to quit?"): self.master.destroy() def create_widgets(self): self.buttons_frame = Frame(self.master) self.buttons_frame.grid(row = 10, sticky = W) self.search_frame = Frame(self.master) self.search_frame.grid(row = 1, sticky = W, columnspan = 2) self.comboBox = ttk.Combobox(self.search_frame, width = 3) self.comboBox.grid(row = 0, column = 14, sticky = W) self.comboBox[''values''] = ( ''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''I'', ''J'', ''K'', ''L'', ''M'', ''N'', ''O'', ''P'', ''Q'', ''R'', ''S'', ''T'', ''U'', ''V'', ''W'', ''X'', ''Y'', ''Z'' ) self.btn_Add = Button(self.buttons_frame, text = ''Add'', command = self.add_item) self.btn_Add.grid(row = 0, sticky = W) self.btn_Remove = Button(self.buttons_frame, text = ''Remove'', command = self.remove_item) self.btn_Remove.grid(row = 0, column = 1, sticky = W) self.btn_Edit = Button(self.buttons_frame, text = ''Edit'', command = self.edit_item) self.btn_Edit.grid(row = 0, column = 2, sticky = W) self.btn_Save = Button(self.buttons_frame, text = ''Save'', command = self.save_item) self.btn_Save.grid(row = 0, column = 3, sticky = W) self.btn_Refresh = Button(self.buttons_frame, text = ''Refresh'', command = self.refresh_all) self.btn_Refresh.grid(row = 0, column = 4, sticky = W) self.lblSearch = Label(self.search_frame, text = ''SEARCH: '') self.lblSearch.grid(row = 0, column = 5, sticky = W) self.txt_Search = Text(self.search_frame, height = 1, width = 70) self.txt_Search.grid(row = 0, column = 6, columnspan = 3, sticky = W) self.lblWordsOrPhrases = Label(self.master, text = ''WORDS/PHRASES:'') self.lblWordsOrPhrases.grid(row = 2, column = 0) self.lblWordOrPhrase = Label(self.master, text = ''Word or phrase:'') self.lblWordOrPhrase.grid(row = 2, column = 1, sticky = W) self.listBox = Listbox(self.master, selectmode=''extended'', height = 34, width = 38) self.listBox.grid(row = 3, column = 0, rowspan = 7, sticky = W) self.txt_WordOrPhrase = Text(self.master, height = 1, width = 40) self.txt_WordOrPhrase.grid(row = 3, column = 1, sticky = N) self.lblExplanation = Label(self.master, text = ''Explanation:'') self.lblExplanation.grid(row = 4, column = 1, sticky = W) self.txt_Explanation = Text(self.master, height = 10, width = 40) self.txt_Explanation.grid(row = 5, column = 1, sticky = N) self.lblTranslation = Label(self.master, text = ''Translation:'') self.lblTranslation.grid(row = 6, column = 1, sticky = W) self.txt_Translation = Text(self.master, height = 10, width = 40) self.txt_Translation.grid(row = 7, column = 1, sticky = N) self.lblExamples = Label(self.master, text = ''Example(s):'') self.lblExamples.grid(row = 8, column = 1, sticky = W) self.txt_Example = Text(self.master, height = 10, width = 40) self.txt_Example.grid(row = 9, column = 1, sticky = S) def load_words(self): self.listBox.delete(0, END) self.words.clear() path = os.path.expanduser(''~/Desktop'') vocabulary = os.path.join(path, ''Vocabulary'', ''Words.xml'') if not os.path.exists(vocabulary): if not os.path.exists(os.path.dirname(vocabulary)): os.mkdir(os.path.dirname(vocabulary)) doc = ET.Element(''Words'') tree = ET.ElementTree(doc) tree.write(vocabulary) else: tree = ET.ElementTree(file=vocabulary) for node in tree.findall(''WordOrPhrase''): w = Word(node.find(''Word'').text, node.find(''Explanation'').text, node.find(''Translation'').text, node.find(''Examples'').text) self.words.append(w) self.listBox.insert(END, w.wordorphrase) def save_all(self): path = os.path.expanduser(''~/Desktop'') vocabulary = os.path.join(path, ''Vocabulary'', ''Words.xml'') tree = ET.ElementTree(file=vocabulary) for xNode in tree.getroot().findall(''WordOrPhrase''): tree.getroot().remove(xNode) for w in self.words: xTop = ET.Element(''WordOrPhrase'') xWord = ET.Element(''Word'') xExplanation = ET.Element(''Explanation'') xTranslation = ET.Element(''Translation'') xExamples = ET.Element(''Examples'') xWord.text = w.wordorphrase xExplanation.text = w.explanation xTranslation.text = w.translation xExamples.text = w.example xTop.append(xWord) xTop.append(xExplanation) xTop.append(xTranslation) xTop.append(xExamples) tree.getroot().append(xTop) tree.write(vocabulary) def add_item(self): w = Word(self.get_word(), self.get_explanation(), self.get_translation(), self.get_example()) self.words.append(w) self.listBox.insert(END, w.wordorphrase) self.clear_all() self.save_all() def remove_item(self): word = Word() try: word = find_word(self.listBox.curselection()) except: return if self.listBox.len(curselection()) > 0: try: for item in self.listBox.curselection(): self.words.remove(lambda x: x.wordorphrase == item.text) # listView1.Items[listView1.Items.Count - 1].Selected = true; self.listBox.remove(item) except: pass self.clear_all() else: pass # show messagebox def edit_item(self): pass def save_item(self): pass def clear_all(self): self.txt_WordOrPhrase.delete(''1.0'', END) self.txt_Explanation.delete(''1.0'', END) self.txt_Translation.delete(''1.0'', END) self.txt_Example.delete(''1.0'', END) def refresh_all(self): pass def get_word(self): return self.txt_WordOrPhrase.get(''1.0'', ''1.0 lineend'') def get_explanation(self): return self.txt_Explanation.get(''1.0'', ''1.0 lineend'') def get_translation(self): return self.txt_Translation.get(''1.0'', ''1.0 lineend'') def get_example(self): return self.txt_Example.get(''1.0'', ''1.0 lineend'') def find_word(word): for x in self.words: if x.wordorphrase == word: return x def main(): root = Tk() gui = Vocabulary(root) root.protocol(''WM_DELETE_WINDOW'', gui.on_closing) root.mainloop() if __name__ == ''__main__'': main()