Der Pomodoro-Ansatz ist eigentlich total simpel und genial zugleich. Die Idee stammt von einem italienischen Studenten namens Francesco Cirillo, der in den 80ern Probleme hatte, sich aufs Lernen zu konzentrieren. Er schnappte sich einen dieser kleinen Küchenwecker in Tomatenform (Pomodoro = italienisch für Tomate) und dachte sich: "Ich arbeite jetzt einfach mal 25 Minuten am Stück, ohne Ablenkung."

So funktioniert's:

Du stellst den Timer auf 25 Minuten und arbeitest nur an einer einzigen Aufgabe. Kein Handy checken, keine E-Mails, kein "ach, ich schaue mal schnell was bei YouTube" - einfach nur fokussiert an der einen Sache dran bleiben. Wenn der Timer klingelt, machst du 5 Minuten Pause. Steh auf, trink was, guck aus dem Fenster, aber arbeite nicht weiter.

Nach vier solcher "Pomodoros" (also 4 x 25 Minuten Arbeit + 3 x 5 Minuten Pause) machst du eine längere Pause von 15-30 Minuten.

Warum funktioniert das so gut?

Unser Gehirn mag keine endlosen Aufgaben. "Ich muss heute das ganze Projekt fertig machen" fühlt sich überwältigend an. Aber "ich arbeite jetzt 25 Minuten daran" ist machbar. Es ist wie bei einem Marathon - du denkst nicht an die 42 Kilometer, sondern nur an den nächsten Kilometer.

Plus: Du wirst überrascht sein, wie viel du in 25 Minuten schaffen kannst, wenn du wirklich fokussiert bist. Keine Multitasking-Spielchen, keine Ablenkungen - pure Konzentration.

Der Trick ist auch, dass du nach 25 Minuten meistens gar nicht aufhören willst, weil du im Flow bist. Aber die Pause ist wichtig - sie verhindert, dass dein Gehirn ermüdet und hält die Motivation hoch.

Probier's einfach mal aus - du brauchst nur einen Timer und ein bisschen Disziplin oder einfach ein cooles Python Programm:

Also lass und loslegen zuerst bauen wir eine Klasse die wir PomodoroTimer

class PomodoroTimer:
    def __init__(self):
        self.arbeitszeit = 25 * 60  # 25 Minuten in Sekunden
        self.timer_laeuft = False


self.arbeitszeit ist eine "Eigenschaft" unseres Timers - jeder Timer "merkt" sich seine Arbeitszeit

Das self bedeutet "dieser spezielle Timer" - wichtig bei Klassen!


Nun bauen wir unsere Methoden, also die wichtigste unseren countdown:

def countdown(self, dauer: int, beschreibung: str, typ: str = "arbeit"):
    self.timer_laeuft = True
    verbleibend = dauer
    
    while verbleibend > 0 and self.timer_laeuft:
        # Hier läuft der Countdown
        verbleibend -= 1
        time.sleep(1)  # 1 Sekunde warten


def countdown(self, ...) - das self ist immer der erste Parameter

dauer: int bedeutet "dauer soll eine Zahl sein" (Type Hints - hilft beim Verstehen)

typ: str = "arbeit" bedeutet "wenn nichts angegeben wird, nimm 'arbeit'"


Nun kommen wir zu unserm Herzen die While-Schleife:


while verbleibend > 0 and self.timer_laeuft:

    # Bildschirm aktualisieren
    self.clear_screen()
    print(f"Zeit: {self.formatiere_zeit(verbleibend)}")
    
    verbleibend -= 1  # Eine Sekunde abziehen
    time.sleep(1)     # Eine Sekunde warten


while = "Solange diese Bedingung wahr ist, mache weiter"

verbleibend > 0 = "Solange noch Zeit übrig ist"

and self.timer_laeuft = "UND der Timer läuft noch"

time.sleep(1) = "Warte 1 Sekunde" - ohne das würde alles zu schnell ablaufen


Nun wollen wir die Ausgabe der Zeit verbessern:

def formatiere_zeit(self, sekunden: int) -> str:

    minuten = sekunden // 60  # Ganzzahl-Division
    sek = sekunden % 60       # Rest der Division (Modulo)
    return f"{minuten:02d}:{sek:02d}"

Dazu wenden wir Tricks an


Eine Besonderheit hat unser Code: Wir machen zwei Dinge gleichzeitig. Das schaffen wir mit Threads und das ganze nennt man Threading.

Normaler Python Code läuft linear also eine Sache nach der anderen - eigentlich so was wir mit dem Pomodoro Timer erreichen wollen - uns nicht von der Sache ablenken lassen. Aber in unserem Code wollen wir den Timer laufen lassen und auf Tasten hören. Dazu müssen wir unserem Programm zwei Dinge gleichzeitig beibringen. Das machen wir mit

listener_thread = threading.Thread(target=self.tastatur_listener, daemon=True)
listener_thread.start()

Thread startet eine "parallele Spur"

daemon=True bedeutet "stirb mit dem Hauptprogramm"


Aber was passiert wenn ein Fehler auftritt? Wenn ein Fehler passiert beendet sich das Programm einfach und “wirft” eine so genannte Exception. Das ist meist nicht gut. Daher gibt es Strukturen, die es zulassen, das wir den Fehler behandeln können. Das ganze nennt man Exception Handling - klingt gut oder?


try:
    zeit = int(input("Neue Zeit in Minuten: "))
    if 1 <= zeit <= 120:
        return zeit
except ValueError:
    print("❌ Bitte eine gültige Zahl eingeben.")
    return None


int("abc") würde das Programm zum Absturz bringen

try: = "Versuche das"

except ValueError: = "Falls ein ValueError auftritt, mache das stattdessen"

So stürzt unser Programm nie ab bei falschen Eingaben


Nun hier das ganze Programm:

import time

import threading

import os

import sys

from datetime import datetime

from typing import Optional


class PomodoroTimer:

"""

Ein vollständiger Pomodoro-Timer mit allen klassischen Features.

25 Min Arbeit -> 5 Min Pause -> Nach 4 Zyklen: 30 Min lange Pause

"""

def __init__(self):

# Zeiten in Sekunden (für Tests kannst du die Werte reduzieren)

self.arbeitszeit = 25 * 60 # 25 Minuten

self.kurze_pause = 5 * 60 # 5 Minuten

self.lange_pause = 30 * 60 # 30 Minuten

# Status-Variablen

self.aktuelle_session = 0

self.completed_pomodoros = 0

self.timer_laeuft = False

self.pause_timer = False

self.timer_thread = None

# Für Statistiken

self.session_start = None

self.tagesstatistik = []

def clear_screen(self):

"""Bildschirm leeren für bessere Übersicht"""

os.system('cls' if os.name == 'nt' else 'clear')

def zeige_banner(self):

"""Zeigt einen schönen Banner"""

print("🍅" * 50)

print(" P O M O D O R O T I M E R")

print("🍅" * 50)

print()

def formatiere_zeit(self, sekunden: int) -> str:

"""Formatiert Sekunden zu MM:SS Format"""

minuten = sekunden // 60

sek = sekunden % 60

return f"{minuten:02d}:{sek:02d}"

def spiele_ton(self, typ: str = "normal"):

"""

Spielt einen Benachrichtigungston (plattformabhängig)

Typ: 'normal', 'pause', 'fertig'

"""

try:

if os.name == 'nt': # Windows

import winsound

if typ == "pause":

winsound.Beep(800, 500) # Höherer Ton für Pause

elif typ == "fertig":

# Drei Töne für "Session komplett"

for _ in range(3):

winsound.Beep(1000, 300)

time.sleep(0.1)

else:

winsound.Beep(600, 800) # Normaler Ton

else: # Linux/Mac

# Einfacher Systemton

os.system('echo -e "\a"')

except:

# Fallback: Text-basierte "Töne"

if typ == "pause":

print("🔔 BEEP BEEP! Zeit für eine Pause!")

elif typ == "fertig":

print("🎉 DING DING DING! Session komplett!")

else:

print("⏰ DING! Zeit um!")

def countdown(self, dauer: int, beschreibung: str, typ: str = "arbeit"):

"""

Haupt-Countdown Funktion

Args:

dauer: Dauer in Sekunden

beschreibung: Was gerade läuft (z.B. "Arbeitszeit")

typ: "arbeit", "kurze_pause", "lange_pause"

"""

self.timer_laeuft = True

verbleibend = dauer

# Icon basierend auf Typ

if typ == "arbeit":

icon = "💼"

elif typ == "kurze_pause":

icon = "☕"

else:

icon = "🏖️"

while verbleibend > 0 and self.timer_laeuft:

if not self.pause_timer:

self.clear_screen()

self.zeige_banner()

print(f"{icon} {beschreibung}")

print(f"Pomodoro #{self.aktuelle_session + 1}")

print(f"Heute abgeschlossen: {self.completed_pomodoros}")

print()

# Große Zeitanzeige

zeit_str = self.formatiere_zeit(verbleibend)

print("┌" + "─" * 20 + "┐")

print(f"│ {zeit_str} │")

print("└" + "─" * 20 + "┘")

print()

# Fortschrittsbalken

fortschritt = (dauer - verbleibend) / dauer

balken_laenge = 30

gefuellt = int(fortschritt * balken_laenge)

balken = "█" * gefuellt + "░" * (balken_laenge - gefuellt)

prozent = int(fortschritt * 100)

print(f"[{balken}] {prozent}%")

print()

# Steuerung

print("Steuerung: [SPACE] Pause/Weiter | [S] Stopp | [R] Reset")

print(" [Q] Beenden | [ENTER] für Menü")

verbleibend -= 1

time.sleep(1)

if self.timer_laeuft: # Nur wenn nicht manuell gestoppt

# Session beenden

if typ == "arbeit":

self.completed_pomodoros += 1

self.tagesstatistik.append({

'zeit': datetime.now().strftime("%H:%M"),

'typ': 'Pomodoro',

'dauer': self.arbeitszeit // 60

})

self.spiele_ton("normal")

elif typ == "kurze_pause":

self.spiele_ton("pause")

else:

self.spiele_ton("fertig")

def tastatur_listener(self):

"""

Lauscht auf Tastatureingaben während der Timer läuft

Läuft in separatem Thread

"""

while self.timer_laeuft:

try:

if os.name == 'nt':

import msvcrt

if msvcrt.kbhit():

taste = msvcrt.getch().decode('utf-8').lower()

self.handle_input(taste)

else:

# Linux/Mac - einfachere Variante

pass

except:

pass

time.sleep(0.1)

def handle_input(self, taste: str):

"""Behandelt Tastatureingaben"""

if taste == ' ': # Leertaste für Pause/Weiter

self.pause_timer = not self.pause_timer

if self.pause_timer:

print("\n⏸️ Timer pausiert - Drücke SPACE zum Fortsetzen")

else:

print("\n▶️ Timer läuft weiter...")

elif taste == 's': # S für Stopp

self.timer_laeuft = False

print("\n🛑 Timer gestoppt!")

elif taste == 'r': # R für Reset

self.reset_session()

elif taste == 'q': # Q für Beenden

self.timer_laeuft = False

print("\n👋 Pomodoro Timer beendet!")

sys.exit()

def starte_arbeitszeit(self):

"""Startet eine 25-minütige Arbeitsphase"""

if self.session_start is None:

self.session_start = datetime.now()

print(f"🍅 Starte Pomodoro #{self.aktuelle_session + 1}")

print("Konzentriere dich auf EINE Aufgabe!")

input("\nDrücke ENTER wenn du bereit bist...")

# Keyboard listener in separatem Thread starten

listener_thread = threading.Thread(target=self.tastatur_listener, daemon=True)

listener_thread.start()

self.countdown(self.arbeitszeit, "🍅 ARBEITSZEIT - Stay focused!", "arbeit")

if self.timer_laeuft:

self.aktuelle_session += 1

# Entscheiden was als nächstes kommt

if self.aktuelle_session % 4 == 0:

self.starte_lange_pause()

else:

self.starte_kurze_pause()

def starte_kurze_pause(self):

"""Startet eine 5-minütige Pause"""

print("\n☕ Zeit für eine kurze Pause!")

print("Steh auf, bewege dich, trink was!")

input("Drücke ENTER um die Pause zu starten...")

self.countdown(self.kurze_pause, "☕ KURZE PAUSE - Entspann dich!", "kurze_pause")

if self.timer_laeuft:

print("\n⚡ Pause vorbei! Bereit für den nächsten Pomodoro?")

input("Drücke ENTER um weiterzumachen...")

self.starte_arbeitszeit()

def starte_lange_pause(self):

"""Startet eine 30-minütige lange Pause"""

print("\n🏖️ Fantastisch! Du hast 4 Pomodoros geschafft!")

print("Zeit für eine längere Pause - du hast sie dir verdient!")

input("Drücke ENTER um die lange Pause zu starten...")

self.countdown(self.lange_pause, "🏖️ LANGE PAUSE - Richtig entspannen!", "lange_pause")

if self.timer_laeuft:

print("\n🔥 Wow! Du bist wirklich produktiv heute!")

print("Möchtest du eine neue Session starten?")

antwort = input("(j/n): ").lower()

if antwort == 'j':

self.aktuelle_session = 0 # Reset für neue 4er-Runde

self.starte_arbeitszeit()

else:

self.zeige_tagesstatistik()

def reset_session(self):

"""Setzt die aktuelle Session zurück"""

self.timer_laeuft = False

self.aktuelle_session = 0

self.pause_timer = False

print("\n🔄 Session zurückgesetzt!")

def zeige_tagesstatistik(self):

"""Zeigt die Statistiken des Tages"""

self.clear_screen()

print("📊 DEINE HEUTIGE BILANZ")

print("=" * 40)

if self.session_start:

dauer = datetime.now() - self.session_start

print(f"Session-Dauer: {str(dauer).split('.')[0]}")

print(f"Abgeschlossene Pomodoros: {self.completed_pomodoros}")

print(f"Gesamte Arbeitszeit: {self.completed_pomodoros * 25} Minuten")

if self.completed_pomodoros > 0:

print(f"Durchschnitt pro Stunde: {self.completed_pomodoros * 25 / max(1, (datetime.now() - self.session_start).seconds / 3600):.1f} Min")

print("\n📈 Verlauf:")

for eintrag in self.tagesstatistik:

print(f" {eintrag['zeit']} - {eintrag['typ']} ({eintrag['dauer']} Min)")

if self.completed_pomodoros >= 8:

print("\n🏆 CHAMPION! 8+ Pomodoros sind Weltklasse!")

elif self.completed_pomodoros >= 4:

print("\n🌟 SUPER! Sehr produktiver Tag!")

elif self.completed_pomodoros >= 1:

print("\n👍 GUT! Ein guter Anfang!")

print("\n" + "=" * 40)

def zeige_menu(self):

"""Hauptmenü des Pomodoro Timers"""

while True:

self.clear_screen()

self.zeige_banner()

print("Was möchtest du tun?")

print()

print("1. 🍅 Pomodoro starten")

print("2. ⚙️ Einstellungen")

print("3. 📊 Heute's Statistik")

print("4. ❓ Hilfe")

print("5. 👋 Beenden")

print()

auswahl = input("Deine Wahl (1-5): ").strip()

if auswahl == '1':

self.starte_arbeitszeit()

elif auswahl == '2':

self.einstellungen_menu()

elif auswahl == '3':

self.zeige_tagesstatistik()

input("\nDrücke ENTER um zurück zum Menü zu gehen...")

elif auswahl == '4':

self.zeige_hilfe()

elif auswahl == '5':

self.zeige_tagesstatistik()

print("\n👋 Bis bald! Bleib produktiv!")

break

else:

print("🤔 Ungültige Auswahl. Bitte wähle 1-5.")

time.sleep(1)

def einstellungen_menu(self):

"""Einstellungen für den Timer"""

while True:

self.clear_screen()

print("⚙️ EINSTELLUNGEN")

print("=" * 30)

print(f"1. Arbeitszeit: {self.arbeitszeit // 60} Minuten")

print(f"2. Kurze Pause: {self.kurze_pause // 60} Minuten")

print(f"3. Lange Pause: {self.lange_pause // 60} Minuten")

print("4. Zurück zum Hauptmenü")

print()

auswahl = input("Was möchtest du ändern? (1-4): ").strip()

if auswahl == '1':

neue_zeit = self.eingabe_zeit("Arbeitszeit")

if neue_zeit:

self.arbeitszeit = neue_zeit * 60

elif auswahl == '2':

neue_zeit = self.eingabe_zeit("Kurze Pause")

if neue_zeit:

self.kurze_pause = neue_zeit * 60

elif auswahl == '3':

neue_zeit = self.eingabe_zeit("Lange Pause")

if neue_zeit:

self.lange_pause = neue_zeit * 60

elif auswahl == '4':

break

def eingabe_zeit(self, typ: str) -> Optional[int]:

"""Hilfsfunktion für Zeiteingabe"""

try:

zeit = int(input(f"Neue {typ} in Minuten (1-120): "))

if 1 <= zeit <= 120:

print(f"✅ {typ} auf {zeit} Minuten geändert!")

time.sleep(1)

return zeit

else:

print("❌ Bitte eine Zahl zwischen 1 und 120 eingeben.")

time.sleep(1)

except ValueError:

print("❌ Bitte eine gültige Zahl eingeben.")

time.sleep(1)

return None

def zeige_hilfe(self):

"""Zeigt Hilfe und Tipps"""

self.clear_screen()

print("❓ HILFE & TIPPS")

print("=" * 40)

print()

print("🍅 WAS IST POMODORO?")

print("25 Min fokussiert arbeiten → 5 Min Pause")

print("Nach 4 Pomodoros → 30 Min lange Pause")

print()

print("💡 TIPPS FÜR MAXIMALE PRODUKTIVITÄT:")

print("• Wähle VOR dem Start eine konkrete Aufgabe")

print("• Schalte Handy stumm & schließe andere Apps")

print("• Bei Unterbrechungen: notiere sie kurz und mach weiter")

print("• In Pausen: aufstehen, sich bewegen, nicht am Bildschirm bleiben")

print("• Sei nicht zu hart zu dir - Übung macht den Meister!")

print()

print("⌨️ STEUERUNG WÄHREND DES TIMERS:")

print("SPACE - Timer pausieren/fortsetzen")

print("S - Timer stoppen")

print("R - Session zurücksetzen")

print("Q - Programm beenden")

print()

input("Drücke ENTER um zurück zum Menü zu gehen...")



# Hauptprogramm

if __name__ == "__main__":

try:

timer = PomodoroTimer()

timer.zeige_menu()

except KeyboardInterrupt:

print("\n\n👋 Pomodoro Timer beendet!")

except Exception as e:

print(f"\n❌ Ein Fehler ist aufgetreten: {e}")

print("Bitte starte das Programm neu.")




Kapitel-Ressourcen

Schau dir hier den Code an ☕ Projekt unterstützen Zurück zum Index

Wie du die Beispiele verwendest

Für Anfänger: Besuche Phyton Editor und probiere den Code aus.

Für Fortgeschrittene: Lade das komplette Repository von GitHub herunter und arbeite lokal mit Visual Studio oder VS Code.