daten aus textdatei in einer liste ausgben

Fragen zu Tkinter.
Antworten
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Hallo ich versuche seid einigen tagen erfolglos daten aus einer text datei einzulesen.
Und Zwar am besten wäre es die daten zeihen für zeihe einzulesen und in eine listbox zu schreiben.

Das ziel ist es am Schluss die Daten aus der txt datei einzulesen schön anzuzeigen (geordnet) und die Möglichkeit einzelne zeihen zu löschen.


Vielen Dank schon mal :D
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Luggi: was hast Du versucht und was funktioniert nicht?
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Danke für die schnelle antwort
Hier habe ich erst versucht die daten aus der txt in die Listblox zu importieren dies habe ich allerdings wieder verworfen.
Im label wird immer nur einen Zeile ausgegeben.
Wenn ich die daten in der Konsole ausgibt dan funktioniert dies auch allerdings halt natürlich nicht in der listbox

Code: Alles auswählen

	def ausgeben():
		file = open("musik.txt", "r")
		for z in file:
			name, titel = z.strip("[]\n").split(";")
			name = name.strip("\'")
			titel = titel.strip()
			#listb = Listbox(ausgabefenster)
			#listb.grid(row=1, column=2)
			label_ausgabe["text"] = str("Name:"+name+"Titel:"+titel)
			#print("Name:"+name+"Titel:"+titel)
			

		file.close()
		
	label_ausgabe = Label(ausgabefenster, text="")
	label_ausgabe.grid(row=1, column=1)
	button_ausgeben = Button(ausgabefenster, text="test", command=ausgeben)
	button_ausgeben.grid(row=4, column=1)
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

Ich würde die Zeilen der Textdatei erst in eine Liste einlesen.
Danach in die Listbox übertragen.

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

class Main:
    def __init__(self, master):
        self.frame = ttk.Frame(master)
        self.frame.pack()
        self.listb = tk.Listbox(self.frame, height=5)
        self.listb.pack()
        self.btn = ttk.Button(self.frame, text='Ausgeben', 
                                        command=self.ausgeben)
        self.btn.pack()
        
    def ausgeben(self):
        musik_list = []
        with open('musik.txt') as file:
            for line in file:
                musik_list.append(line)
            
        for element in musik_list:
            self.listb.insert(tk.END, element)
  
  
root = tk.Tk()
main = Main(root)
root.mainloop()
Auf die "Schnelle" so.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Flano: warum liest Du die Datei erst in eine Liste ein, um dann die Liste in einem zweiten Schritt in die Listbox zu packen?

@Luggi: die Listbox innerhalb Deiner Schleife zu erstellen, macht keinen Sinn, denn Du willst ja nur **eine** Listbox für alle Zeilen. Wie sieht denn die "musik.txt"-Datei aus. Das mit den Eckigen Klammern und Anführungszeichen sieht seltsam aus?
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Zur zeit sieht meinen musik.txt so aus,
Ich habe dazu einfach einen Eingabe Maske geschrieben die das mit der folgenden "Formatierung" in die musik.txt schreibt, allerdings ich bin mir mittlerweile nicht mehr so sicher ob diese form so sinnvoll ist


[codebox=text file=Unbenannt.txt][Die Toten Hosen;Tage wie diese ]
[Pentatonix;Joy to the World]
[Pentatonix;Hallelujah]
[Pentatonix;Coldest Winter]
[Carolin No;Deep]
[Kungs;Don`t You Know]
[Gloria;Ohne Träume]
[/code]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die rechteckigen Klammern sind Unfug. Sie bieten keinerlei Mehrwert, sondern müssen im Gegenteil „mühselig“ entfernt und eingebaut werden.

Der Rest ist eine klassische CSV Datei, das ist ein angemessenes Format. Ggf wäre eine Kopfzeile mit „Interpret;Titel“ nett, für den kenntnislosen Betrachter.
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

@Sirius3: Richtig, muss man nicht erst in eine Liste packen. Unter

"...schön anzuzeigen (geordnet)..."

hatte ich schon die Weiterverarbeitung im Kopf, wie sortieren etc. .
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

hi

@Flano habe es jetzt wie du in deinem "Beispiel" mit einer liste gelöst
ich sitze gerade an der weiteren Sortierung.

Habe mittlerweile noch weitere Daten hinzugenommen(Album, Titel länge etc.) , dies Funktioniert auch.

Nun versuche ich die liste so zu Formatieren das nur auf knopf druck alle Informationen ausgegeben werden (so was wie Dateityp)
Das ganze wird noch dadurch erschwert das ich eine Funkion habe um den Inhalt zu löschen (also einzelne Zeilen)

Code: Alles auswählen

	def loeschen():
		inhalt = listb.curselection()
		listb.delete(inhalt)
		speichern()

		
	def speichern():
		speich = listb.get(ACTIVE)
		hallo = speich 
		musik_list.remove(speich)
		
		file = open("musik.txt", "w")	
		for item in musik_list:
			file.write(item)

		file.close()
Ich weis das dies Hier nicht unbedingt die schönste und beste Lösung :/ ist aber sie funktioniert jetzt erst mal.

Nun habe ich allerdings immer noch das Problem mit dem Formatieren.
Mein Lösungsansatz war erst einfach einen zweite txt datei zu erstellen in der ich die daten ausfühlich stehen habe.
Allerdings würden diese ja dann nicht gelöscht werden und somit müsste man immer erst in der einen liste ein Titel löschen und dann in der anderen.

Daher wollte ich die Ausgabe der listbox filtern dies ist mir bis jetzt aber nicht wirklich gelungen.
Denn es muss ja immer der Ganze "Datensatz" zu einem Lied gelöscht werden und nicht nur Titel und band.


Schon mal danke
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

Wenn ich das jetzt so richtig verstanden habe, willst du in einer Listbox jeweils in einer Zeile Titel und Interpret anzeigen.
Wählt der User einen Eintrag aus der Liste aus, soll dieser extra mit allen weiteren Einzelheiten(Album, Länge etc.) angezeigt werden.
Löscht der User diesen Eintrag, soll der Eintrag nicht nur aus der Listbox, sondern auch komplett aus der Liste verschwinden.

Unter Tkinter ist es möglich mit einer Listvariable zu arbeiten. Ändert man die Liste(Listvariable), ändern sich auch entsprechend
die Listbox Einträge.

Allerdings ist das nur die "Halbe Miete".
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Danke für den hinweiß ich werde mal versuchen dies zu realisieren
Luggi
User
Beiträge: 8
Registriert: Freitag 29. Dezember 2017, 11:12

Ich habe das ganze jetzt per Treeview versucht dies hat allerdings nicht wirklich funktioniert.
Ich habe erst mal versucht einfach alle Daten aus zugeben die daten sind allerdings nicht in der Richtigen Spalte gelandet,
ich glaube ich habe etwas übersehen vielleicht sehr ihr es ja


Bild

Code: Alles auswählen

def musik_ausgeben_neu_ansatz():
	global musik_list_neu
	musik_list_neu = []
	global tabellen_titel
	tabellen_titel = ["Band", "Titel", "Album", "Länge", "Format"]
	ausgabefenster_neu = Toplevel(fenster)
	frame = Frame(ausgabefenster_neu)
	frame.grid(row=1, column=1)
	#listb = Listbox(frame, height=20, width=30)
	#listb.grid(row=2, column=1)
	tree = ttk.Treeview(ausgabefenster_neu, columns=tabellen_titel, show="headings")
	tree.grid(in_=ausgabefenster_neu)
	
	def loeschen():
		inhalt = listb.curselection()
		listb.delete(inhalt)
		speichern()

		
	def speichern():
		speich = listb.get(ACTIVE)
		hallo = speich 
		'''print (hallo)
		print(speich)
		#del musik_list_neu[hallo]
		#for item in speich:
		#	musik_list_neu.remove(item)
		#speich = listb.get(0, END)
		'''#for item in speich:
		musik_list_neu.remove(speich)
		#print (musik_list_neu)
		
		file = open("musik.txt", "w")		#datei musik.txt wird erstellt das w steht für write 
		for item in musik_list_neu:
			file.write(item)
		#file.write = (musik_list_neu)
		#file.write("Titel "+titel+"\n")
		file.close()
	def ausgabe_test():
		print (musik_list_neu)
		
	
	
	def ausgeben():
		with open ("musik.txt") as file:
			for line in file:
				musik_list_neu.append(line)
			for tit in tabellen_titel:
				tree.heading(tit, text=tit.title())
			for item in musik_list_neu:
				tree.insert("", "end", values=item)
			
	ausgeben()
	
	ausgabe_test_button = Button(frame, text="Test", command=ausgabe_test)
	ausgabe_test_button.grid(row=3, column=3)
			
	#speicher_button = Button(frame, text="Änderung speichern", command=speichern)
	#speicher_button.grid(row=3, column=2)
	del_button = Button(frame, text="Löschen und Änderung speichern", command=loeschen)
	del_button.grid(row=3, column=1)
		
	#button = Button(frame, text="Neu Laden", command=ausgeben)
	#button.grid(row=3, column=0)
	


[codebox=text file=Unbenannt.txt]('John', 'Smith', 'test', '3:56', '.mp3'),
('Toten Hosen', 'Schrei nach Liebe', 'test Toten hosen ', '3:56', '.mp3'),
('Deine Freunde', 'Schokolade', 'test deine Freunde', '3:66', '.mp3'),
('Die Ärtze', 'An tagen wie diesen', 'test Die Ärtze', '3:86', '.mp3'),
('Pentatonix', 'Halleloja', 'test pentatonix', '3:68', '.wav'),
[/code]


Vielleicht sieht je einer von euch wodurch die titel so komisch verschoben werden (in den falschen spalten stehen).
Antworten