warum funktioniert das nicht?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
StMan
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2026, 17:48

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
Gruß Manfred
Benutzeravatar
Dennis89
User
Beiträge: 1670
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
StMan
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2026, 17:48

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
Gruß Manfred
Benutzeravatar
snafu
User
Beiträge: 6915
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
StMan
User
Beiträge: 9
Registriert: Sonntag 11. Januar 2026, 17:48

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
Gruß Manfred
Pedroski55
User
Beiträge: 32
Registriert: Freitag 25. Juli 2025, 00:20

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)
Benutzeravatar
snafu
User
Beiträge: 6915
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14276
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Benutzeravatar
snafu
User
Beiträge: 6915
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
Antworten