Was erwartet dich?
In diesem Projekt baust du PyBuddy CLI — einen interaktiven Kommandozeilen-Assistenten, der alle Konzepte aus den 13 Kapiteln vereint. Am Ende hast du ein vollständiges Programm, das du stolz in dein Portfolio stellen kannst.
Projektübersicht
PyBuddy CLI ist ein persönlicher Assistent im Terminal. Er begrüßt den Nutzer, speichert ein Profil, führt kleine Tools aus und merkt sich alles in einer JSON-Datei. Das Projekt nutzt alle Kapitel-Konzepte:
input() und f-Strings für die Begrüßungwhile-Schleife für das Hauptmenüdatetime, json, random)Anforderungen
Dein PyBuddy CLI muss folgende Features haben. Arbeite die Punkte Schritt für Schritt ab:
-
Begrüßung: Fragt nach dem Namen und begrüßt den Nutzer personalisiert.
-
Profil-System: Speichert Name, Level, XP und Badges in einem Dictionary.
-
Hauptmenü: Zeigt ein Menü mit Optionen und wiederholt sich bis "exit".
-
XP-Rechner: Berechnet Gesamt-XP aus Basis-XP, Multiplikator und Bonus.
-
To-Do-Liste: Aufgaben hinzufügen, anzeigen und erledigen.
-
Zufalls-Zitat: Zeigt ein zufälliges motivierendes Zitat aus einer Liste.
-
Speichern & Laden: Profil als JSON speichern und beim Start wieder laden.
Schritt für Schritt
Schritt 1: Projektstruktur
Erstelle einen Ordner pybuddy-cli/ mit zwei Dateien:
pybuddy-cli/
├── main.py # Hauptprogramm
└── profil.json # Wird automatisch erstellt
Schritt 2: Die Grundstruktur
Beginne mit den Imports und der Profil-Verwaltung:
import json
import random
from datetime import datetime
PROFIL_DATEI = "profil.json"
ZITATE = [
"Jeder Experte war mal ein Anfänger.",
"Code ist wie Humor — wenn man ihn erklären muss, ist er schlecht.",
"Der beste Weg, Python zu lernen: Tippen, nicht nur Lesen!",
"Fehler sind keine Fehler — sie sind Debugging-Gelegenheiten.",
"Ein Programm, das läuft, ist besser als ein perfektes, das nicht existiert."
]
def profil_laden():
"""Lädt das Profil aus der JSON-Datei oder erstellt ein neues."""
try:
with open(PROFIL_DATEI, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return {
"name": "",
"level": 1,
"xp": 0,
"badges": ["PyBuddy Nutzer"],
"aufgaben": []
}
def profil_speichern(profil):
"""Speichert das Profil als JSON."""
with open(PROFIL_DATEI, "w", encoding="utf-8") as f:
json.dump(profil, f, indent=2, ensure_ascii=False)
Schritt 3: Die Tool-Funktionen
Jedes Menü-Feature wird als eigene Funktion umgesetzt:
def zeige_status(profil):
"""Zeigt das aktuelle Profil an."""
print(f"\n{'='*30}")
print(f" 👤 {profil['name']}")
print(f" 🏆 Level {profil['level']}")
print(f" ⭐ {profil['xp']} XP")
print(f" 🎖️ Badges: {', '.join(profil['badges'])}")
print(f"{'='*30}\n")
def xp_rechner(profil):
"""Berechnet neue XP und prüft auf Level-Up."""
basis = int(input("Basis-XP: "))
mult = float(input("Multiplikator (z.B. 1.5): "))
bonus = int(input("Bonus-XP: "))
neu = int(basis * mult + bonus)
profil["xp"] += neu
# Level-Up alle 500 XP
neues_level = profil["xp"] // 500 + 1
if neues_level > profil["level"]:
profil["level"] = neues_level
badge = f"Level {neues_level}"
if badge not in profil["badges"]:
profil["badges"].append(badge)
print(f"🎉 Level-Up! Du bist jetzt Level {neues_level}!")
print(f"➕ +{neu} XP erhalten!")
print(f"⭐ Gesamt: {profil['xp']} XP")
def todo_manager(profil):
"""Verwaltet die To-Do-Liste."""
print("\n📋 To-Do-Manager")
print("[1] Aufgabe hinzufügen")
print("[2] Aufgaben anzeigen")
print("[3] Aufgabe erledigen")
wahl = input("Wahl: ")
if wahl == "1":
task = input("Neue Aufgabe: ")
profil["aufgaben"].append({"text": task, "done": False})
print("✅ Hinzugefügt!")
elif wahl == "2":
if not profil["aufgaben"]:
print("ℹ️ Keine Aufgaben vorhanden.")
for i, task in enumerate(profil["aufgaben"], 1):
status = "✓" if task["done"] else "□"
print(f" {i}. {status} {task['text']}")
elif wahl == "3":
nr = int(input("Nummer der erledigten Aufgabe: "))
if 1 <= nr <= len(profil["aufgaben"]):
profil["aufgaben"][nr-1]["done"] = True
profil["xp"] += 10
print("✅ Erledigt! +10 XP")
def zufalls_zitat():
"""Zeigt ein zufälliges Zitat."""
print(f"\n💬 {random.choice(ZITATE)}\n")
def uhrzeit_anzeigen():
"""Zeigt die aktuelle Uhrzeit."""
jetzt = datetime.now()
print(f"🕐 {jetzt.strftime('%H:%M:%S')} — {jetzt.strftime('%d.%m.%Y')}")
Schritt 4: Das Hauptmenü
Das Herzstück: Eine while-Schleife, die das Menü anzeigt und die Eingabe verarbeitet:
def hauptmenue(profil):
"""Zeigt das Hauptmenü und verarbeitet die Eingabe."""
while True:
print(f"\n{'='*30}")
print(f" 🤖 PyBuddy CLI")
print(f" Hallo, {profil['name']}!")
print(f"{'='*30}")
print(" [1] 👤 Profil anzeigen")
print(" [2] ➕ XP berechnen")
print(" [3] 📋 To-Do-Manager")
print(" [4] 💬 Zufalls-Zitat")
print(" [5] 🕐 Uhrzeit")
print(" [0] 🚪 Beenden")
print(f"{'='*30}")
wahl = input("\nWähle (0-5): ").strip()
if wahl == "0":
profil_speichern(profil)
print(f"💾 Profil gespeichert. Bis bald, {profil['name']}!")
break
elif wahl == "1":
zeige_status(profil)
elif wahl == "2":
xp_rechner(profil)
elif wahl == "3":
todo_manager(profil)
elif wahl == "4":
zufalls_zitat()
elif wahl == "5":
uhrzeit_anzeigen()
else:
print("⚠️ Ungültige Eingabe. Bitte 0-5.")
Schritt 5: Der Einstiegspunkt
Verbinde alles in der main()-Funktion:
def main():
print("🤖 Willkommen bei PyBuddy CLI!")
profil = profil_laden()
# Erster Start?
if not profil["name"]:
profil["name"] = input("Wie heißt du? ").strip()
print(f"\n👋 Hallo {profil['name']}! Schön, dass du da bist.")
profil_speichern(profil)
else:
print(f"\n👋 Willkommen zurück, {profil['name']}!")
hauptmenue(profil)
if __name__ == "__main__":
main()
Das komplette Programm
Hier ist der gesamte Code in einer Datei. Kopiere ihn in main.py und starte ihn mit python main.py:
"""
PyBuddy CLI — Abschlussprojekt Python Classic
Alle 13 Kapitel vereint in einem interaktiven Assistenten.
"""
import json
import random
from datetime import datetime
PROFIL_DATEI = "profil.json"
ZITATE = [
"Jeder Expert*innen war mal ein*e Anfänger*in.",
"Code ist wie Humor — wenn man ihn erklären muss, ist er schlecht.",
"Der beste Weg, Python zu lernen: Tippen, nicht nur Lesen!",
"Fehler sind keine Fehler — sie sind Debugging-Gelegenheiten.",
"Ein Programm, das läuft, ist besser als ein perfektes, das nicht existiert."
]
# ── Profil-Verwaltung ───────────────────────────────
def profil_laden():
try:
with open(PROFIL_DATEI, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return {
"name": "", "level": 1, "xp": 0,
"badges": ["PyBuddy Nutzer"], "aufgaben": []
}
def profil_speichern(profil):
with open(PROFIL_DATEI, "w", encoding="utf-8") as f:
json.dump(profil, f, indent=2, ensure_ascii=False)
# ── Tool-Funktionen ─────────────────────────────────
def zeige_status(profil):
print(f"\n{'='*35}")
print(f" Profil: {profil['name']}")
print(f" Level {profil['level']} | {profil['xp']} XP")
print(f" Badges: {', '.join(profil['badges'])}")
print(f" Aufgaben: {len(profil['aufgaben'])}")
print(f"{'='*35}\n")
def xp_rechner(profil):
basis = int(input("Basis-XP: "))
mult = float(input("Multiplikator: "))
bonus = int(input("Bonus: "))
neu = int(basis * mult + bonus)
profil["xp"] += neu
neues_level = profil["xp"] // 500 + 1
if neues_level > profil["level"]:
profil["level"] = neues_level
profil["badges"].append(f"Level {neues_level}")
print(f">>> Level-Up! Level {neues_level}!")
print(f">>> +{neu} XP | Gesamt: {profil['xp']}")
def todo_manager(profil):
print("\n--- To-Do-Manager ---")
print("[1] Hinzufügen [2] Anzeigen [3] Erledigen")
wahl = input("Wahl: ")
if wahl == "1":
profil["aufgaben"].append({"text": input("Aufgabe: "), "done": False})
print("Hinzugefügt!")
elif wahl == "2":
for i, t in enumerate(profil["aufgaben"], 1):
s = "[x]" if t["done"] else "[ ]"
print(f" {i}. {s} {t['text']}")
elif wahl == "3":
nr = int(input("Nummer: "))
profil["aufgaben"][nr-1]["done"] = True
profil["xp"] += 10
print("Erledigt! +10 XP")
def zufalls_zitat():
print(f"\n>>> {random.choice(ZITATE)}\n")
def uhrzeit_anzeigen():
j = datetime.now()
print(f">>> {j.strftime('%H:%M:%S')} — {j.strftime('%d.%m.%Y')}")
# ── Hauptmenü ───────────────────────────────────────
def hauptmenue(profil):
while True:
print(f"\n{'='*35}")
print(f" PyBuddy CLI — {profil['name']}")
print(f"{'='*35}")
print(" [1] Profil [2] XP-Rechner")
print(" [3] To-Do [4] Zitat")
print(" [5] Uhrzeit [0] Beenden")
print(f"{'='*35}")
wahl = input("Wähle (0-5): ").strip()
if wahl == "0":
profil_speichern(profil)
print(f"Gespeichert. Tschüss, {profil['name']}!")
break
elif wahl == "1": zeige_status(profil)
elif wahl == "2": xp_rechner(profil)
elif wahl == "3": todo_manager(profil)
elif wahl == "4": zufalls_zitat()
elif wahl == "5": uhrzeit_anzeigen()
else: print("Ungültig. Bitte 0-5.")
# ── Start ───────────────────────────────────────────
def main():
print("=== PyBuddy CLI ===")
profil = profil_laden()
if not profil["name"]:
profil["name"] = input("Wie heißt du? ").strip()
print(f"Hallo {profil['name']}!")
profil_speichern(profil)
else:
print(f"Willkommen zurück, {profil['name']}!")
hauptmenue(profil)
if __name__ == "__main__":
main()
Erweiterungsideen
Dein PyBuddy CLI ist fertig — aber du kannst es noch weiter ausbauen. Hier sind Ideen, die du mit den Kapitel-Konzepten umsetzen kannst:
requests das aktuelle Wetter ab (Kapitel 11)matplotlibrandom🏆 Glückwunsch!
Du hast alle 13 Kapitel durchlaufen und ein vollständiges Python-Programm gebaut. Das ist mehr, als viele Programmierer in ihrem ersten Monat schaffen. Dein PyBuddy CLI nutzt Variablen, Bedingungen, Schleifen, Listen, Dictionaries, Funktionen, Module und File I/O — alles in einem Projekt. Zeig es deinen Freunden, erweitere es weiter und vor allem: Programmiere weiter!