Seite 1 von 1

Listbox soll Text in File speichern

Verfasst: Freitag 20. Juni 2008, 19:17
von szhwdr
Hallo erstmal

Ich möchte mit einem Entry Feld einträge in eine Listbox generieren. Dann soll beim doppel klicken auf den Eintrag in der Liste ein Wert in ein File eingetragen werden. Dies funktioniert aber nur für den letztne Eintrag in der Liste sauber. Was habe ich vergessen?

gruss
Roel



Code: Alles auswählen

from Tkinter import *
import tkFont
import os
import codecs


class TopLevelTest3:
    def NewWindow(self):
        self.root2 = Toplevel()
        self.WortSortierenLB = Listbox (self.root2, font=tkFont.Font(family='Tahoma', size='16'))
        self.WortSortierenLB.grid(row=0, column=0)
        self.WortSortierenLB.bind("<Double-1>",self.getListboxEntry)
        self.createEntry = Entry(self.root2,font=tkFont.Font(family='Tahoma', size='16'))
        self.createEntry.grid(row=5,column=1)
        self.createEntry.insert(0,'')
        self.createEntry.focus_force()
        self.createEntry.bind("<Return>", self.entryInputInListbox)
        fpListbox = open('.\\listboxEntry.txt', 'r')
        self.inputEntryFile = [line[:]for line in fpListbox.readlines()]
        for item in self.inputEntryFile:
                self.WortSortierenLB.insert(END, item)
        self.root2.title("New Window")
        self.root2.mainloop()
    def __init__(self):
        self.root1 = Tk()
        self.grid = Frame(self.root1)
        self.grid.pack()
        self.canvas1 = Canvas(self.root1, width=200, height=200)
        self.canvas1.grid(in_=self.grid,row=0,column=0)
        self.canvas2 = Canvas(self.root1, width=200, height=200)
        self.canvas2.grid(in_=self.grid,row=0,column=1)
        self.root1.title("TopLevelTest")
        self.menubar = Menu(self.root1)
        self.menubar.add_command(label="New Window",command=self.NewWindow)
        self.root1.config(menu=self.menubar)
        self.root1.mainloop()
        
    def entryInputInListbox(self, event):
        self.WortSortierenLB.insert(END,self.createEntry.get())
        fpOutputEntry = open('.\\listboxEntry.txt','a')
        fpOutputEntry.writelines('\n' + self.createEntry.get())
        
    def getListboxEntry(self,event):
        self.indexFromListbox = self.WortSortierenLB.curselection()
        self.x = self.WortSortierenLB.get(self.indexFromListbox)
        cwd = os.getcwd()
        cwd1 = cwd + '\\' + self.x
        print cwd1
        fp1 = codecs.open(cwd1,'a', 'UTF-8')
        fp1.write('Was auch immer fuer Text oder Variablen Inhalt')
        fp1.close() 

TopLevelTest3()

Verfasst: Samstag 21. Juni 2008, 10:17
von wuf
Hallo szhwdr

Hast du dein Codestück auf Linux oder Windows ausgetestet?

Gruss wuf :wink:

Verfasst: Montag 23. Juni 2008, 04:52
von szhwdr
Ich habe es auf windows XP und Vista getestet.
gruss
Roel

Verfasst: Dienstag 24. Juni 2008, 07:24
von wuf
Hallo Roel

Habe das Skript einmal auf Windows-XP ausgetestet. Machte folgende Änderungen:

a) Bei der Eingabe des ersten Namen wird dieser ohne '\n' in die Datei ' listboxEntry.txt' gespeichert.

b) Beim Speichern eines Wertes unter dem Namen aus der Listbox (mit Doppelklick) muss bei der Pfad-Bildung verhindert werden, dass am Namen aus der Listbox ein '\n' dranhängt. Dieses muss entfernt werden.

Hier der modifizierte Code:

Code: Alles auswählen

class TopLevelTest3:
    def NewWindow(self):
        self.root2 = Toplevel()
        self.WortSortierenLB = Listbox (self.root2, font=tkFont.Font(family='Tahoma', size='16'))
        self.WortSortierenLB.grid(row=0, column=0)
        self.WortSortierenLB.bind("<Double-1>",self.getListboxEntry)
        self.createEntry = Entry(self.root2,font=tkFont.Font(family='Tahoma', size='16'))
        self.createEntry.grid(row=5,column=1)
        self.createEntry.insert(0,'')
        self.createEntry.focus_force()
        self.createEntry.bind("<Return>", self.entryInputInListbox)
        fpListbox = open('.\\listboxEntry.txt', 'r')
        self.inputEntryFile = [line[:]for line in fpListbox.readlines()]
        for item in self.inputEntryFile:
                self.WortSortierenLB.insert(END, item)
        self.root2.title("New Window")
        self.root2.mainloop()
        
    def __init__(self):
        self.root1 = Tk()
        self.grid = Frame(self.root1)
        self.grid.pack()
        self.canvas1 = Canvas(self.root1, width=200, height=200)
        self.canvas1.grid(in_=self.grid,row=0,column=0)
        self.canvas2 = Canvas(self.root1, width=200, height=200)
        self.canvas2.grid(in_=self.grid,row=0,column=1)
        self.root1.title("TopLevelTest")
        self.menubar = Menu(self.root1)
        self.menubar.add_command(label="New Window",command=self.NewWindow)
        self.root1.config(menu=self.menubar)
        self.root1.mainloop()
       
    def entryInputInListbox(self, event):
        """Eintrag in die Listbox und Datei"""
        
        self.WortSortierenLB.insert(END,self.createEntry.get())
        fpOutputEntry = open('.\\listboxEntry.txt','a')
        if self.WortSortierenLB.size() == 1:
            #~~ Dies ist der erste Eintrag in die Liste. Der Wert aus
            #   dem Entry-Feld ohne '\n' in der Datei 'listboxEntry.txt'
            #   speichern
            fpOutputEntry.writelines(self.createEntry.get())
        else:
            #~~ Dies ist der zweite oder höhere Eintrag in die Liste. Dem
            #   Wert aus dem Entry-Feld ein '\n' anhängen und in der Datei
            #   'listboxEntry.txt' speichern
            fpOutputEntry.writelines('\n' + self.createEntry.get())
        
    def getListboxEntry(self,event):
        self.indexFromListbox = self.WortSortierenLB.curselection()
        self.x = self.WortSortierenLB.get(self.indexFromListbox)
        
        #~~ Entferne das '\n' vom Namen aus der Listbox
        self.x = self.x.replace("\n","")

        print 'Save',len(self.x)
        cwd = os.getcwd()
        cwd1 = cwd + '\\' + self.x

        fp1 = codecs.open(cwd1,'a', 'UTF-8')
        fp1.write('Was auch immer fuer Text oder Variablen Inhalt')
        fp1.close()

TopLevelTest3()
N.B. Habe das Skript nur unter Windows-XP ausgetestet. Unter Linux muss noch eine Anpassung der Dateipfade erfolgen.

Gruss wuf :wink:

Verfasst: Dienstag 24. Juni 2008, 08:20
von mkesper
wuf hat geschrieben:N.B. Habe das Skript nur unter Windows-XP ausgetestet. Unter Linux muss noch eine Anpassung der Dateipfade erfolgen.
Deshalb benutzt man ja auch os.path.join() :).
Die doppelten Backslashes kann man sich mit

Code: Alles auswählen

r'Pfadname\mit_Backslash'
sparen.

Verfasst: Dienstag 24. Juni 2008, 09:52
von wuf
Hallo mkallas

Super! Schon wieder etwas gelernt.

Danke für deinen Tipp!

Gruss wuf :wink:

Verfasst: Dienstag 24. Juni 2008, 17:31
von wuf
Hallo

Diese Variante sollte auf Windows und Linux funktionieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

#~~ Skript entry_listbox_save.py (24.06.2008)

from Tkinter import *
import tkFont
import os
import codecs


class TopLevelTest3:

    def NewWindow(self):
        self.root2 = Toplevel()
        self.WortSortierenLB = Listbox (self.root2, font=tkFont.Font(family='Tahoma', size='16'))
        self.WortSortierenLB.grid(row=0, column=0)
        self.WortSortierenLB.bind("<Double-1>",self.getListboxEntry)
        self.createEntry = Entry(self.root2,font=tkFont.Font(family='Tahoma', size='16'))
        self.createEntry.grid(row=5,column=1)
        self.createEntry.insert(0,'')
        self.createEntry.focus_force()
        self.createEntry.bind("<Return>", self.entryInputInListbox)

        path = os.getcwd()+ os.sep
        try:
            fpListbox = open(path + 'listboxEntry.txt', 'r')
            self.inputEntryFile = [line[:]for line in fpListbox.readlines()]
            for item in self.inputEntryFile:
                item = item.replace("\n","")
                print 'Item',item
                self.WortSortierenLB.insert(END, item)
        except:
            fpListbox = None

        self.root2.title("New Window")
        self.root2.mainloop()

    def __init__(self):
        """Konstruktor"""

        self.root1 = Tk()
        self.grid = Frame(self.root1)
        self.grid.pack()
        self.canvas1 = Canvas(self.root1, width=200, height=200)
        self.canvas1.grid(in_=self.grid,row=0,column=0)
        self.canvas2 = Canvas(self.root1, width=200, height=200)
        self.canvas2.grid(in_=self.grid,row=0,column=1)
        self.root1.title("TopLevelTest")
        self.menubar = Menu(self.root1)
        self.menubar.add_command(label="New Window",command=self.NewWindow)
        self.root1.config(menu=self.menubar)
        self.root1.mainloop()

    def entryInputInListbox(self, event):
        """Eintrag in die Listbox und Datei"""

        self.WortSortierenLB.insert(END,self.createEntry.get())

        path = os.getcwd()+ os.sep
        fpOutputEntry = open(path + 'listboxEntry.txt','a')

        if self.WortSortierenLB.size() == 1:
            #~~ Dies ist der erste Eintrag in die Liste. Der Wert aus
            #   dem Entry-Feld ohne '\n' in der Datei 'listboxEntry.txt'
            #   speichern
            fpOutputEntry.writelines(self.createEntry.get())
        else:
            #~~ Dies ist der zweite oder höhere Eintrag in die Liste. Dem
            #   Wert aus dem Entry-Feld ein '\n' anhängen und in der Datei
            #   'listboxEntry.txt' speichern
            fpOutputEntry.writelines("\n" + self.createEntry.get())

    def getListboxEntry(self,event):
        self.indexFromListbox = self.WortSortierenLB.curselection()
        self.x = self.WortSortierenLB.get(self.indexFromListbox)

        #~~ Entferne das '\n' vom Namen aus der Listbox
        self.x = self.x.replace("\n","")

        path = os.getcwd()+ os.sep
        cwd1 = path + self.x

        fp1 = codecs.open(cwd1,'a', 'UTF-8')
        fp1.write('Was auch immer fuer Text oder Variablen Inhalt')
        fp1.close()

TopLevelTest3() 

Gruss wuf :wink:

Verfasst: Mittwoch 25. Juni 2008, 04:35
von szhwdr
Vielen Dank fuer Eure Hilfe. Jetzt funktioniert es .
gruss
Roel