2017-04-13 7 views
2

Ich bin eine einfache GUI-Anwendung erstellen unbekannte Wörter zu verwalten, während eine neue Sprache lernen. Das Problem ist, wenn ich das Wort eingeben, starten Sie die Anwendung neu, geben Sie ein anderes Wort ein und starten Sie die Anwendung erneut - das erste eingegebene Wort verdoppelt sich. Die Anzahl der doppelten Wörter steigt mit der Anzahl der eingegebenen Wörter an. Hierdoppelte Wörter in einem listbox

Vocabulary

ist das, was ich getan habe:

# 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 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='multiple', 
           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 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 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): 
     self.listBox.delete(ACTIVE) 

    def edit_item(self): 
     pass 

    def save_item(self): 
     pass 

    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('Word'): 
      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.findall('Words'): 
      tree.remove(xNode) 

     for w in self.words: 
      xTop = ET.Element('Word') 
      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 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 on_closing(self): 
     self.save_all 
     if messagebox.askokcancel("Quit", "Do you want to quit?"): 
      self.master.destroy() 

def main(): 
    root = Tk() 
    gui = Vocabulary(root) 
    root.protocol('WM_DELETE_WINDOW', gui.on_closing) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 
+0

Haben Sie sichergestellt, dass die xml Sie lesen in korrekt ist? Wissen Sie, das Problem ist mit der Listbox, und kein Problem mit dem Speichern der Daten oder dem Lesen der Daten? Wenn es genau zwei Einträge in der XML-Datei gibt, haben Sie überprüft, ob 'für Knoten in tree.findall ('Word')' genau zweimal ausgeführt wird? Bitte machen Sie ein wenig Debugging, bevor Sie eine so umfassende Frage stellen. –

+0

Wenn es um die XML kommt, ist es irgendwie nicht in lesbarer Form: ' test1<Übersetzung />', alles in einer Zeile ist, und es sollte nicht so sein. Ich weiß nicht, warum das passiert. Das Problem ist jedoch wahrscheinlich das Speichern/Lesen der Daten und nicht die Listbox selbst. Wie kann ich überprüfen, dass 'für Knoten in tree.findall ('Word') 'genau zweimal ausgeführt wird? –

Antwort

2

Ihr Problem ist nicht in der List, sondern in der Art und Weise Sie Ihre Worte in XML in save_all(self) speichern. Um richtig den Baum zurückzusetzen, sollten Sie ersetzen:

for xNode in tree.findall('Words'): 
    tree.remove(xNode) 

mit

for xNode in tree.getroot().findall('Word'): 
    tree.getroot().remove(xNode) 
+1

Vielen Dank Herr, das hat mein Problem gelöst. –

+1

Nun, gute Antwort, also ist mein upvote +110 wert :) –

+0

Hehe, danke Billal! D – Josselin

Verwandte Themen