Listbox soll Text in File speichern

Fragen zu Tkinter.
Antworten
szhwdr
User
Beiträge: 11
Registriert: Samstag 22. März 2008, 12:40

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()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo szhwdr

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

Gruss wuf :wink:
Take it easy Mates!
szhwdr
User
Beiträge: 11
Registriert: Samstag 22. März 2008, 12:40

Ich habe es auf windows XP und Vista getestet.
gruss
Roel
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo mkallas

Super! Schon wieder etwas gelernt.

Danke für deinen Tipp!

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
szhwdr
User
Beiträge: 11
Registriert: Samstag 22. März 2008, 12:40

Vielen Dank fuer Eure Hilfe. Jetzt funktioniert es .
gruss
Roel
Antworten