Aufgabe 22 - To-do-Liste als Desktop-App
Aufgabe 22 - To-do-Liste als Desktop-App
Abschnitt betitelt „Aufgabe 22 - To-do-Liste als Desktop-App“Worum geht es?
Abschnitt betitelt „Worum geht es?“Ihre erste vollständige Desktop-Anwendung: eine To-do-Liste mit Tkinter. Im Zentrum steht nicht die Oberfläche selbst, sondern die Architekturregel des Kapitels: Die Fachlogik weiß nichts von der GUI und bleibt dadurch testbar (siehe Kapitel GUI mit Python). Die Reihenfolge der Teile ist deshalb verbindlich: erst die Logik samt Tests, dann die Oberfläche.
Was Sie dafür brauchen
Abschnitt betitelt „Was Sie dafür brauchen“- Kapitel GUI mit Python vollständig; Kapitel Exceptions, Testen mit pytest und Dateien und Datenformate.
- Python mit Tkinter (Standardbibliothek), pytest, VS Code, ein Git-Repository.
Welche Kompetenzen Sie erwerben und zeigen
Abschnitt betitelt „Welche Kompetenzen Sie erwerben und zeigen“- Sie bauen eine GUI mit Widgets,
grid-Layout und Ereignisbehandlung als Klasse auf. - Sie trennen Fachlogik und Oberfläche in eigene Module und testen die Logik automatisiert.
- Sie fangen Fehlbedienung ab und melden sie benutzergerecht über Dialoge.
Pädagogische Einordnung
Abschnitt betitelt „Pädagogische Einordnung“- Reproduktion: die GUI-Grundbausteine (Fenster, Widgets, Handler) anwenden (Teile A und B).
- Reorganisation und Transfer: die Schichtentrennung auf ein eigenes Programm übertragen und Persistenz integrieren (Teile B und C).
- Reflexion, Problemlösung und Urteilsbildung: die Oberfläche gegen Fehlbedienung absichern, den Entwurf strukturieren und Architekturentscheidungen begründen (Teile C und D).
Arbeitsaufträge
Abschnitt betitelt „Arbeitsaufträge“Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.
Teil A - Fachlogik zuerst, ohne ein einziges Fenster
Abschnitt betitelt „Teil A - Fachlogik zuerst, ohne ein einziges Fenster“- Implementieren Sie in
todo_logic.pydie KlasseTodoListmitadd(text, priority)(Priorität 1 bis 3; leerer Text oder ungültige Priorität führen zuValueError),complete(index),remove(index),open_tasks()undcompleted_tasks(). - Schreiben Sie in
test_todo.pyfünf pytest-Tests: hinzufügen, erledigen, ungültige Priorität (pytest.raises), leerer Text, ungültiger Index. - Alle Tests grün, bevor irgendetwas mit Tkinter passiert. Halten Sie in einem Kommentar fest, warum diese Reihenfolge nur funktioniert, weil die Klasse kein Tkinter importiert.
Teil B - Die Oberfläche
Abschnitt betitelt „Teil B - Die Oberfläche“- Bauen Sie in
todo_gui.pyeine KlasseTodoApp(nach dem Muster des Kapitels): Eingabefeld, Prioritätsauswahl (1 bis 3), Button “Add”, eine Listbox mit den offenen Aufgaben, Buttons “Done” und “Delete” für den ausgewählten Eintrag, ein Label3 open / 5 done. - Layout mit
grid: Beschriftungen rechtsbündig, Eingabespalte wächst mit dem Fenster (columnconfiguremitweight), einheitliche Abstände mitpadx/pady. - Anzeigeformat der Listbox:
[!!!] SEW homework, Rufzeichen entsprechend der Priorität, sortiert nach Priorität. - Verbindliche Regel: Jeder Handler ruft ausschließlich Methoden der
TodoListauf und zeichnet danach über eine einzige Methoderefresh_view()neu. Kein Handler hält eigene Aufgabendaten.
Teil C - Fehlbedienung und Persistenz
Abschnitt betitelt „Teil C - Fehlbedienung und Persistenz“- Nichts darf crashen: leerer Text, “Done” ohne Auswahl, hektische Doppelklicks.
ValueErroraus der Logik wird im Handler gefangen und alsmessagebox.showwarningmit verständlichem Text gemeldet. - Beim Schließen des Fensters wird die Liste als JSON gespeichert, beim Start wieder geladen (recherchieren Sie
root.protocol("WM_DELETE_WINDOW", ...)). Eine fehlende Datei bedeutet: leere Liste; eine kaputte Datei führt zu einer Meldung und einem Neustart mit leerer Liste, nicht zum Absturz. - Härtetest durch die Sitznachbarin oder den Sitznachbarn: fünf Minuten freies Bedienen. Protokollieren Sie gefundene Probleme und beheben Sie sie.
Teil D - Expertenteil: Struktur für Wachstum
Abschnitt betitelt „Teil D - Expertenteil: Struktur für Wachstum“- Kapseln Sie die Aufgabenliste als eigene Widget-Klasse
TaskListPanel(tk.Frame)mit den Methodenrefresh(tasks)undget_selected_index(). Das Hauptfenster spricht nur noch mit dem Panel, nicht mehr mit der Listbox direkt. - Ergänzen Sie einen Filter (alle / nur Priorität 1) als Zustand des Panels, ohne die
TodoList-Klasse zu verändern. Begründen Sie in zwei Sätzen, warum der Filter in die Ansicht gehört und nicht in die Fachlogik. - Ergänzen Sie Tastaturkomfort mit
bind: Eingabetaste fügt hinzu, Entf löscht den ausgewählten Eintrag. - Architektur-Nachweis: Führen Sie
pytestaus, während die GUI-Datei gar nicht importierbar wäre (benennen Sie sie testweise um). Die Logik-Tests müssen unverändert laufen. Erklären Sie in drei Sätzen, was dieser Nachweis über Ihre Schichtentrennung beweist und warum das für Teamarbeit zählt.
Wissenscheck
Abschnitt betitelt „Wissenscheck“- Was ist die Ereignisschleife, und warum steht nach
mainloop()kein weiterer Programmcode? - Warum muss es
command=self.on_addheißen und nichtcommand=self.on_add()? - Wo wird ein
ValueErroraus der Fachlogik gefangen, und warum genau dort? - Warum bleibt eine GUI-freie Logikklasse testbar, eine mit eingebauten
messagebox-Aufrufen aber nicht? - Was gehört in
refresh_view(), und warum darf Anzeigezustand nirgendwo sonst gepflegt werden?
todo_logic.py, todo_gui.py, test_todo.py und die gespeicherte JSON-Datei, als Git-Repository mit nachvollziehbarer Historie (mindestens fünf thematisch getrennte Commits); dazu das Härtetest-Protokoll.