Python Daten speichern

siehe auch Dateien speichern

Um mit mehreren Daten zu arbeiten, werden oftmals Dictonarys (dt. Wörterbücher) verwendet

Dictonarys dienen zum Speichern von Datenwerten in Schlüssel-Wert-Paaren. Ein Dictonarys ist eine geordnete*, veränderbare Sammlung, die keine Duplikate zulässt. Die Syntax für Dictionaries in Python: Die Schlüssel müssen als Strings in Anführungszeichen geschrieben werden, nicht wie in JavaScript ohne Anführungszeichen.

adresse = {
    "vorname":"Mandy",
    "nachname":"Seider",
    "ort":"Kiel"
}

Ausgabe der Anzahl der Elemente im Dictonary:

print (len(adresse))

Zugriff auf Elemente

Sie können auf die Elemente eines Wörterbuchs zugreifen, indem Sie auf den Schlüsselnamen in eckigen Klammern verweisen:

x=adresse.get("vorname")

Die Methode keys() gibt eine Liste aller Schlüssel im Wörterbuch zurück.

Um mehrere Eingaben in deinem Tkinter-Programm zu speichern, musst du die Eingaben nach jedem Klick auf „Speichern“ in einer Datenstruktur wie einer Liste ablegen. Zusätzlich kannst du sie optional in einer Datei (z.B. als JSON) dauerhaft speichern. Hier ein Beispiel, wie du das umsetzen kannst:

Beispiel: Mehrere Eingaben in einer Liste speichern

Bei jedem Klick auf „Speichern“ wird der aktuelle Text aus dem Entry-Feld mit .get() ausgelesen und zur Liste eingaben hinzugefügt. Das Eingabefeld wird danach geleert. Mit dem Button „Alle Eingaben speichern“ werden alle gesammelten Einträge in eine JSON-Datei geschrieben. Die Nutzung einer Liste ist der Standardweg, um mehrere Werte zwischenzuspeichern

Du kannst die Liste später beliebig weiterverarbeiten oder beim Programmstart aus einer Datei wieder laden.

Hinweis

  • Wenn du mehrere Entry-Felder gleichzeitig verwalten willst, kannst du sie in einer Liste speichern und mit einer Schleife auslesen

Die Methode .get() liest jeweils den aktuellen Wert eines Entry-Feldes aus

Mit diesem Ansatz kannst du beliebig viele Eingaben nacheinander erfassen

import tkinter as tk
from tkinter import messagebox
import json
import os

# Liste zum Speichern der Eingaben
eingaben = []

def speicherung():
    text = e1.get()
    if text:
        eingaben.append(text)
        e1.delete(0, tk.END)  # Eingabefeld leeren
        messagebox.showinfo("Gespeichert", f"Eingabe gespeichert: {text}")
    else:
        messagebox.showwarning("Fehler", "Bitte Text eingeben!")

def speichern_in_datei():
    with open("eingaben.json", "w", encoding="utf-8") as f:
        json.dump(eingaben, f, ensure_ascii=False, indent=2)
    messagebox.showinfo("Datei", "Alle Eingaben wurden in 'eingaben.json' gespeichert.")

root = tk.Tk()
root.geometry("300x300")
l1 = tk.Label(text="Text eingeben, der gespeichert werden soll:")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
b1 = tk.Button(text="Speichern", command=speicherung)
b1.pack()
b2 = tk.Button(text="Alle Eingaben speichern", command=speichern_in_datei)
b2.pack()
root.mainloop()

Es gibt verschiedene Möglichkeiten, Daten fortlaufend zu speichern. Hier sind zwei bewährte Ansätze:

1. Speichern nach jeder Eingabe (z.B. nach Drücken von Enter)

Du kannst einen Event-Handler für das Entry-Feld einrichten, der bei jeder Eingabe speichert:

import tkinter as tk
from tkinter import messagebox
import json

eingaben = []

def speichern_in_datei():
with open("eingaben.json", "w", encoding="utf-8") as f:
json.dump(eingaben, f, ensure_ascii=False, indent=2)

def eingabe_speichern(event=None):
text = e1.get().strip()
if text:
eingaben.append(text)
speichern_in_datei() # Speichert sofort nach jeder Eingabe
e1.delete(0, tk.END)

root = tk.Tk()
root.geometry("300x300")
l1 = tk.Label(text="Text eingeben, der gespeichert werden soll:")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
e1.bind("<Return>", eingabe_speichern) # Speichert bei Enter
b2 = tk.Button(text="Dateien Speichern", command=speichern_in_datei)
b2.pack()
root.mainloop()

Vorteil:
Jede Eingabe wird sofort gespeichert, kein Datenverlust bei Absturz.

2. Automatisches Speichern in festen Intervallen

Du kannst auch einen Timer verwenden, der z.B. alle 10 Sekunden automatisch speichert:

import tkinter as tk
from tkinter import messagebox
import json

eingaben = []

def speichern_in_datei():
with open("eingaben.json", "w", encoding="utf-8") as f:
json.dump(eingaben, f, ensure_ascii=False, indent=2)

def eingabe_speichern(event=None):
text = e1.get().strip()
if text:
eingaben.append(text)
e1.delete(0, tk.END)

def auto_speichern():
speichern_in_datei()
root.after(10000, auto_speichern) # alle 10 Sekunden

root = tk.Tk()
root.geometry("300x300")
l1 = tk.Label(text="Text eingeben, der gespeichert werden soll:")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
e1.bind("<Return>", eingabe_speichern)
b2 = tk.Button(text="Dateien Speichern", command=speichern_in_datei)
b2.pack()

root.after(10000, auto_speichern) # startet automatisches Speichern
root.mainloop()

Vorteil:
Auch ohne Benutzeraktion wird regelmäßig gespeichert.

Tipp:

Du kannst beide Methoden kombinieren:

  • Sofortiges Speichern nach jeder Eingabe
  • Zusätzlich regelmäßiges Backup

Hinweis:
Achte darauf, dass du nicht zu oft speicherst (Performance), aber auch nicht zu selten (Datenverlust).

Der Code wird immer überschrieben. Neue Eingaben sollen aber in die Datei hinzugefügt werden
Das Schreiben mit "w" im open()-Befehl überschreibt immer die gesamte Datei. Wenn du neue Eingaben anhängen möchtest, musst du die bisherigen Daten aus der Datei lesen, die neue Eingabe hinzufügen und dann alles wieder speichern.

Code: Neue Eingaben an bestehende Datei anhängen

import tkinter as tk
from tkinter import messagebox
import json
import os

DATEINAME = "eingaben.json"

def lade_eingaben():
if os.path.exists(DATEINAME):
with open(DATEINAME, "r", encoding="utf-8") as f:
try:
return json.load(f)
except json.JSONDecodeError:
return []
return []

def speichere_eingaben(eingaben):
with open(DATEINAME, "w", encoding="utf-8") as f:
json.dump(eingaben, f, ensure_ascii=False, indent=2)

def eingabe_speichern(event=None):
text = e1.get().strip()
if text:
eingaben = lade_eingaben() # Vorherige Daten laden
eingaben.append(text) # Neue Eingabe anhängen
speichere_eingaben(eingaben)
e1.delete(0, tk.END)
messagebox.showinfo("Gespeichert", "Eingabe wurde gespeichert!")

root = tk.Tk()
root.geometry("300x300")
l1 = tk.Label(text="Text eingeben, der gespeichert werden soll:")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
e1.bind("<Return>", eingabe_speichern)
b2 = tk.Button(text="Eingabe speichern", command=eingabe_speichern)
b2.pack()
root.mainloop()

Was macht dieser Code?

  • Liest beim Speichern immer zuerst die Datei ein (falls sie existiert).
  • Fügt die neue Eingabe zur Liste hinzu.
  • Speichert die aktualisierte Liste zurück in die Datei.

Eingaben auslesen:

import tkinter as tk
from tkinter import messagebox

eingaben = []  # Hier werden alle Eingaben gesammelt

def eingabe_speichern(event=None):
    text = e1.get().strip()
    if text:
        eingaben.append(text)  # Neue Eingabe zur Liste hinzufügen
        e1.delete(0, tk.END)
        messagebox.showinfo("Gespeichert", "Eingabe wurde gespeichert!")

def eingaben_anzeigen():
    ausgabe.delete("1.0", tk.END)  # Textbox leeren
    for eintrag in eingaben:       # Mit Schleife alle Einträge anzeigen
        ausgabe.insert(tk.END, eintrag + "\n")

root = tk.Tk()
root.geometry("350x350")
l1 = tk.Label(text="Text eingeben, der gespeichert werden soll:")
l1.pack()
e1 = tk.Entry(root)
e1.pack()
e1.bind("<Return>", eingabe_speichern)
b1 = tk.Button(text="Eingabe speichern", command=eingabe_speichern)
b1.pack()
b2 = tk.Button(text="Alle Eingaben anzeigen", command=eingaben_anzeigen)
b2.pack()

ausgabe = tk.Text(root, height=10, width=40)
ausgabe.pack()

root.mainloop()