Bankkonto.py

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

# JSON file path
DATA_FILE = "konten1.json"

# Bank account class
class Bankkonto:
    def __init__(self, Inhaber, Kontonummer, Kontostand):
        self.Inhaber = Inhaber
        self.Kontonummer = Kontonummer
        self.Kontostand = float(Kontostand)

    def konto_öffnen(self):
        return f"Inhaber: {self.Inhaber}\nIBAN: {self.Kontonummer}\nKontostand: {self.Kontostand:.2f} €"

    def auszahlen(self, betrag):
        if betrag <= self.Kontostand:
            self.Kontostand -= betrag
            save_konten()
            return f"Auszahlung erfolgreich.\nNeuer Kontostand: {self.Kontostand:.2f} €"
        else:
            return "Nicht genügend Guthaben für diese Auszahlung."

    def einzahlen(self, betrag):
        self.Kontostand += betrag
        save_konten()
        return f"Einzahlung erfolgreich.\nNeuer Kontostand: {self.Kontostand:.2f} €"

    def to_dict(self):
        return {
            "Inhaber": self.Inhaber,
            "Kontonummer": self.Kontonummer,
            "Kontostand": self.Kontostand
        }

# Load account data from JSON file
def load_konten():
    if os.path.exists(DATA_FILE):
        try:
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                data = json.load(f)
            # Validierung: Prüfen ob alle Keys stimmen
            for name, info in data.items():
                if "Kontonummer" not in info or "Inhaber" not in info or "Kontostand" not in info:
                    raise ValueError("Ungültige Daten im JSON")
            return {name: Bankkonto(**info) for name, info in data.items()}
        except Exception as e:
            print("Fehler beim Laden, erstelle neue Daten:", e)
            return reset_konten()
    else:
        return reset_konten()

# Reset: schreibt Defaultdaten neu
def reset_konten():
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(DEFAULT_DATA, f, indent=4)
    return {name: Bankkonto(**info) for name, info in DEFAULT_DATA.items()}

# Save account data to JSON file
def save_konten():
    data = {name: konto.to_dict() for name, konto in konten.items()}
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=4)

# Load accounts
konten = load_konten()

# GUI functions
def konto_anzeigen():
    name = name_entry.get().upper()
    if name in konten:
        konto_info.set(konten[name].konto_öffnen())
        auszahlen_button.config(state="normal")
        einzahlen_button.config(state="normal")
    else:
        konto_info.set("Kein Konto mit diesem Namen gefunden.")
        auszahlen_button.config(state="disabled")
        einzahlen_button.config(state="disabled")

def auszahlen():
    name = name_entry.get().upper()
    if name in konten:
        try:
            betrag = float(betrag_entry.get())
            result = konten[name].auszahlen(betrag)
            konto_info.set(konten[name].konto_öffnen() + "\n\n" + result)
        except ValueError:
            messagebox.showerror("Fehler", "Bitte eine gültige Zahl eingeben.")
    else:
        messagebox.showerror("Fehler", "Kein gültiges Konto ausgewählt.")

def einzahlen():
    name = name_entry.get().upper()
    if name in konten:
        try:
            betrag = float(einzahlung_entry.get())
            result = konten[name].einzahlen(betrag)
            konto_info.set(konten[name].konto_öffnen() + "\n\n" + result)
        except ValueError:
            messagebox.showerror("Fehler", "Bitte eine gültige Zahl eingeben.")
    else:
        messagebox.showerror("Fehler", "Kein gültiges Konto ausgewählt.")

# GUI setup
root = tk.Tk()
root.title("Bankkonto")
root.geometry("420x350")

tk.Label(root, text="Name eingeben:").grid(row=0, column=0, sticky="e")
name_entry = tk.Entry(root)
name_entry.grid(row=0, column=1)

anzeigen_button = tk.Button(root, text="Konto anzeigen", command=konto_anzeigen)
anzeigen_button.grid(row=0, column=2, padx=10)

konto_info = tk.StringVar()
tk.Label(root, textvariable=konto_info, justify="left").grid(row=1, column=0, columnspan=3, pady=10)

tk.Label(root, text="Auszahlung (€):").grid(row=2, column=0, sticky="e")
betrag_entry = tk.Entry(root)
betrag_entry.grid(row=2, column=1)
auszahlen_button = tk.Button(root, text="Auszahlen", command=auszahlen, state="disabled")
auszahlen_button.grid(row=2, column=2, padx=2)

tk.Label(root, text="Einzahlung (€):").grid(row=3, column=0, sticky="e")
einzahlung_entry = tk.Entry(root)
einzahlung_entry.grid(row=3, column=1)
einzahlen_button = tk.Button(root, text="Einzahlen", command=einzahlen, state="disabled")
einzahlen_button.grid(row=3, column=2, padx=2)

root.mainloop()