Seite 1 von 1
warum funktioniert das nicht?
Verfasst: Donnerstag 22. Januar 2026, 19:34
von StMan
Datenbanken = [ ]
if not Datenbanken: print("ist leer") , Datenbanken.append("1xxx")
else: print('was drin')
die Liste wird aufgefüllt und in Listbox angezeigt.
Beim nächsten Start des Programms ist sie wieder leer
Re: warum funktioniert das nicht?
Verfasst: Donnerstag 22. Januar 2026, 20:07
von Dennis89
Hallo,
das wird nirgends gespeichert. Wenn du das willst, dann musst du Code schreiben, der die Daten in eine Datei schreibt.
Du erstellst zu dem zu Programmstart eine leere Liste mit dem Namen `Datenbanken`. Da kann `Datenbanken` nur leer sein, wenn du die Liste danach gleich abfragst.
Grüße
Dennis
Re: warum funktioniert das nicht?
Verfasst: Donnerstag 22. Januar 2026, 20:18
von StMan
wenn ich das richtig verstehe, muss ich die liste aus einer Datei z.B.txt füllen.
d.h. ich überprüfe als erstes ob die txt vorhanden , wenn ja ,ob sie leer ist oder daten drinstehen.
dann fülle ich die Liste aus der .txt
Re: warum funktioniert das nicht?
Verfasst: Donnerstag 22. Januar 2026, 20:33
von snafu
StMan hat geschrieben: Donnerstag 22. Januar 2026, 20:18
wenn ich das richtig verstehe, muss ich die liste aus einer Datei z.B.txt füllen.
Ganz genau. Ich würde bei relativ simplen Anwendungsfällen mit Grunddatentypen aber das JSON-Format benutzen. Dafür bringt Python ein gleichnamiges Modul mit, das Funktionalität zum Speichern und Laden der Daten enthält.
Re: warum funktioniert das nicht?
Verfasst: Donnerstag 22. Januar 2026, 21:30
von StMan
snafu hat geschrieben: Donnerstag 22. Januar 2026, 20:33
StMan hat geschrieben: Donnerstag 22. Januar 2026, 20:18
wenn ich das richtig verstehe, muss ich die liste aus einer Datei z.B.txt füllen.
Ganz genau. Ich würde bei relativ simplen Anwendungsfällen mit Grunddatentypen aber das JSON-Format benutzen. Dafür bringt Python ein gleichnamiges Modul mit, das Funktionalität zum Speichern und Laden der Daten enthält.
und wie heist das Modul, und wie funktioniert es?
PS. ich bin absoluter Anfänger
Re: warum funktioniert das nicht?
Verfasst: Freitag 23. Januar 2026, 07:53
von Pedroski55
Nur Übungssache: versuch mal!
Code: Alles auswählen
meine_datei = '/home/peterr/temp/irgendwas_speichern.txt'
# open w startet eine neue Datei
# falls die Datei existiert, wird sie überschrieben
with open(meine_datei, 'w') as zu_speichern:
for i in range(10):
zu_speichern.write(f'Zeile {i}.\n')
# open a startet eine neue Datei wenn die Datei nicht existiert, oder
# wenn die Datei existiert, werden Zeilen angehängt.
with open(meine_datei, 'a') as zu_speichern:
for i in range(10):
zu_speichern.write(f'Zeile {i}.\n')
with open(meine_datei, 'a') as zu_speichern:
for i in range(10):
zu_speichern.write(f'Zeile {i}.\n')
# open x meldet einen Fehler wenn die Datei existiert und macht nichts, sicherheitshalber.
with open(meine_datei, 'x') as zu_speichern:
for i in range(10):
zu_speichern.write(f'Zeile {i}.\n')
# FileExistsError: [Errno 17] File exists: '/home/peterr/temp/irgendwas_speichern.txt'
data = []
for i in range(10):
data.append(f'Zeile {i}.\n')
string = ''.join(data)
with open(meine_datei, 'a') as zu_speichern:
zu_speichern.write(string)
Re: warum funktioniert das nicht?
Verfasst: Freitag 23. Januar 2026, 10:15
von snafu
Das Modul heißt wie gesagt genau wie das Format. Die entscheidenden Funktionen sind load() zum Laden der Daten via Datei und das Gegenstück dump() zum Speichern in die Datei. Die Doku zum Modul ist leicht online zu finden, ebenso wie zig Beispiele.
Zu beachten ist noch die konkrete Einbindung in deinen Code (den wir nicht kennen). Soll das Laden und Speichern explizit per Button durch den Anwender erfolgen? Oder etwas magischer per GUI Events? Da du eingangs eine Listbox erwähnt hast, gehe ich mal von einem Framework aus. Mehr Infos wären hier hilfreich.
Re: warum funktioniert das nicht?
Verfasst: Freitag 23. Januar 2026, 17:16
von __blackjack__
@StMan: Man sollte keine Tupel erstellen, einzig weil man mehr als eine Anweisung in eine Zeile pressen will. Und per Konvention schreibt man auch einzelne Anweisungen in einen eingerückten Block statt direkt hinter dem ``:`` in der gleichen Zeile.
Der Code aus dem ersten Beitrag sähe dann so aus:
Code: Alles auswählen
datenbanken = []
if not datenbanken:
print("ist leer")
datenbanken.append("1xxx")
else:
print("was drin")
Edit: Du würdest bei der Textdateivariante zu viel testen. Das die Datei nicht vorhanden ist, merkt man am `FileNotFoundError` den man ja sowieso behandeln sollte. Auch ob die Datei leer ist, braucht man nicht testen. Wenn man 0 Zeilen in eine Liste einliest, dann ist die Liste leer.
Re: warum funktioniert das nicht?
Verfasst: Freitag 23. Januar 2026, 22:45
von snafu
Hier ein klassenbasierter Ansatz mit tkinter:
Code: Alles auswählen
#!/usr/bin/env python3
from pathlib import Path
import tkinter as tk
class ListboxManager:
def __init__(self, root, file_path="entries.txt"):
self.root = root
self.file_path = Path(file_path)
self.add_widgets()
self.load_data()
def add_widgets(self):
self.root.columnconfigure(0, weight=1)
self.root.rowconfigure(1, weight=1)
self.entry = tk.Entry(self.root)
self.entry.grid(row=0, column=0, padx=10, pady=10, sticky="ew")
self.add_button = tk.Button(self.root, text="Add Item", command=self.add_item)
self.add_button.grid(row=0, column=1, padx=10, pady=10)
self.listbox = tk.Listbox(self.root)
self.listbox.grid(row=1, column=0, columnspan=2, padx=10, pady=10, sticky="nsew")
def add_item(self, text=None):
if text is None:
text = self.entry.get()
self.entry.delete(0, tk.END)
if (item := text.strip()):
self.listbox.insert(tk.END, item)
def load_data(self):
try:
with self.file_path.open("r", encoding="utf-8") as stream:
for line in stream:
self.add_item(line)
except FileNotFoundError:
print(f"Could not find '{self.file_path}', starting with an empty listbox")
except Exception as error:
print(f"Error loading data: {error}")
def save_data(self):
try:
items = self.listbox.get(0, tk.END)
self.file_path.write_text("\n".join(items), encoding="utf-8")
except Exception as error:
print(f"Error saving data: {error}")
class ListboxApp(tk.Tk):
def __init__(self, name="Listbox App"):
super().__init__()
self.title(name)
self.manager = ListboxManager(self)
self.protocol("WM_DELETE_WINDOW", self.on_exit)
def on_exit(self):
self.manager.save_data()
self.destroy()
def main():
app = ListboxApp()
app.geometry("400x350")
app.mainloop()
if __name__ == "__main__":
main()
Zum Speichern und Laden der Daten wird eine reine Textdatei genutzt.
Ist es eigentlich okay, dass meine App von tk.TK erbt oder sollte ich besser tk.Frame als Basisklasse benutzen?