Als Erstes habe ich mich informiert, wie man einen Kalender einfügen kann. Erst einmal ohne GUI:
import calendar
kalenderblatt = calendar.LocaleTextCalendar(calendar.MONDAY)
ausgabe = kalenderblatt.formatmonth(2025,2)
print(ausgabe)

Was soll möglich sein?
– mehrere Mitarbeiter?
– vorgegebene Schichten?
– Zuordnung einer Abteilung?
Ich fange natürlich erst einmal mit einem Mitarbeiter – also mir an und baue dann ggf. weiter. Was muss ich also irgendwie einbauen?
– Aktuelles Datum
– Aktuelle Zeit
– Auswahl von Arbeits- / Urlaubs- und Krankentag über Radio Button
– ein einfacher Kommen- und Gehen Button
Dann habe ich die aktuelle Zeit und das aktuelle Datum anzeigen lassen in einem Label über tkinter
import calendar
from tkinter import *
import tkinter as tk
from datetime import datetime, date
import locale
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
def datum_und_zeit_anzeigen():
# Hole das aktuelle Datum und die aktuelle Zeit
heute = date.today()
aktuelles_datum = heute.strftime("%d.%m.%Y")
aktuelle_zeit = datetime.now().strftime("%H:%M:%S")
wochentag = heute.strftime("%A")
# Aktualisiere die Labels
datum_label.config(text=f"{wochentag}, {aktuelles_datum}")
zeit_label.config(text=aktuelle_zeit)
# Stelle sicher, dass die Funktion nach 1000ms (1 Sekunde) erneut aufgerufen wird
root.after(1000, datum_und_zeit_anzeigen)
def kommen():
print("Kommen registriert")
def gehen():
print("Gehen registriert")
def gesamtstunden():
print("Gesamtstunden berechnen")
# Hauptfenster erstellen
root = Tk()
root.geometry("300x300")
root.title("Arbeitszeiterfassung")
# Label für das Datum hinzufügen
datum_label = Label(root, text="", font=("Helvetica", 16))
datum_label.pack(pady=10)
# Label für die Zeit hinzufügen
zeit_label = Label(root, text="", font=("Helvetica", 16))
zeit_label.pack(pady=10)
# Buttons hinzufügen und mit Funktionen verknüpfen
kommen_button = Button(root, text="Kommen", command=kommen)
kommen_button.pack(pady=10)
gehen_button = Button(root, text="Gehen", command=gehen)
gehen_button.pack(pady=10)
gesamtstunden_button = Button(root, text="Gesamtstunden", command=gesamtstunden)
gesamtstunden_button.pack(pady=10)
# Starte die Funktion zur Anzeige des Datums und der aktuellen Zeit
datum_und_zeit_anzeigen()
# Hauptloop starten
root.mainloop()
Ich habe 2 Button erstellt, aber noch nicht mit einer Funktion verbunden

Radio Buttons zur Auswahl des Tages:
import calendar
from tkinter import *
from datetime import datetime, date
import locale
# Lokale Einstellungen für deutsche Wochentage und Datum
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
def datum_und_zeit_anzeigen():
# Hole das aktuelle Datum und die aktuelle Zeit
heute = date.today()
aktuelles_datum = heute.strftime("%d.%m.%Y")
aktuelle_zeit = datetime.now().strftime("%H:%M:%S")
wochentag = heute.strftime("%A")
# Aktualisiere die Labels
datum_label.config(text=f"{wochentag}, {aktuelles_datum}")
zeit_label.config(text=aktuelle_zeit)
# Stelle sicher, dass die Funktion nach 1000ms (1 Sekunde) erneut aufgerufen wird
root.after(1000, datum_und_zeit_anzeigen)
def kommen():
tagestyp = auswahl.get()
print(f"Kommen registriert - Tagestyp: {tagestyp}")
def gehen():
tagestyp = auswahl.get()
print(f"Gehen registriert - Tagestyp: {tagestyp}")
def gesamtstunden():
tagestyp = auswahl.get()
print(f"Gesamtstunden berechnen - Tagestyp: {tagestyp}")
# Hauptfenster erstellen
root = Tk()
root.geometry("400x400")
root.title("Arbeitszeiterfassung")
# Label für das Datum hinzufügen
datum_label = Label(root, text="", font=("Helvetica", 16))
datum_label.pack(pady=10)
# Label für die Zeit hinzufügen
zeit_label = Label(root, text="", font=("Helvetica", 16))
zeit_label.pack(pady=10)
# Radio Buttons zur Auswahl des Tagestyps in einem LabelFrame gruppieren
auswahl_frame = LabelFrame(root, text="Tagestyp auswählen", font=("Helvetica", 14))
auswahl_frame.pack(pady=10, padx=10, fill="both", expand="yes")
# Variable zur Speicherung der Auswahl
auswahl = StringVar()
auswahl.set("Arbeitstag") # Standardauswahl
rb1 = Radiobutton(auswahl_frame, text="Arbeitstag", variable=auswahl, value="Arbeitstag")
rb1.pack(anchor=W)
rb2 = Radiobutton(auswahl_frame, text="Urlaubstag", variable=auswahl, value="Urlaubstag")
rb2.pack(anchor=W)
rb3 = Radiobutton(auswahl_frame, text="Krankentag", variable=auswahl, value="Krankentag")
rb3.pack(anchor=W)
# Buttons hinzufügen und mit Funktionen verknüpfen
kommen_button = Button(root, text="Kommen", command=kommen, font=("Helvetica", 14))
kommen_button.pack(pady=10)
gehen_button = Button(root, text="Gehen", command=gehen, font=("Helvetica", 14))
gehen_button.pack(pady=10)
gesamtstunden_button = Button(root, text="Gesamtstunden anzeigen", command=gesamtstunden, font=("Helvetica", 12))
gesamtstunden_button.pack(pady=10)
# Starte die Funktion zur Anzeige des Datums und der aktuellen Zeit
datum_und_zeit_anzeigen()
# Hauptloop starten
root.mainloop()


Zur Berechnung der Arbeitszeit:
import calendar
from tkinter import *
from datetime import datetime, date
import locale
from tkinter import messagebox
import json
# Lokale Einstellungen für deutsche Wochentage und Datum
locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
def speichere_zeit(aktion):
tagestyp = auswahl.get()
zeit = datetime.now().strftime("%H:%M:%S")
datum = date.today().strftime("%Y-%m-%d")
try:
with open('zeit.json', 'r') as f:
daten = json.load(f)
except FileNotFoundError:
daten = {}
if datum not in daten:
daten[datum] = {"tagestyp": tagestyp, aktion: zeit}
else:
daten[datum][aktion] = zeit
with open('zeit.json', 'w') as f:
json.dump(daten, f)
def datum_und_zeit_anzeigen():
# Hole das aktuelle Datum und die aktuelle Zeit
heute = date.today()
aktuelles_datum = heute.strftime("%d.%m.%Y")
aktuelle_zeit = datetime.now().strftime("%H:%M:%S")
wochentag = heute.strftime("%A")
# Aktualisiere die Labels
datum_label.config(text=f"{wochentag}, {aktuelles_datum}")
zeit_label.config(text=aktuelle_zeit)
# Stelle sicher, dass die Funktion nach 1000ms (1 Sekunde) erneut aufgerufen wird
root.after(1000, datum_und_zeit_anzeigen)
def kommen():
tagestyp = auswahl.get()
speichere_zeit("kommen")
print(f"Kommen registriert - Tagestyp: {tagestyp}")
def gehen():
tagestyp = auswahl.get()
speichere_zeit("gehen")
print(f"Gehen registriert - Tagestyp: {tagestyp}")
def gesamtstunden():
try:
with open('arbeitszeiten.json', 'r') as f:
daten = json.load(f)
heute = date.today().strftime("%Y-%m-%d")
if heute in daten and "kommen" in daten[heute] and "gehen" in daten[heute]:
kommen_zeit = datetime.strptime(daten[heute]["kommen"], "%H:%M:%S")
gehen_zeit = datetime.strptime(daten[heute]["gehen"], "%H:%M:%S")
differenz = gehen_zeit - kommen_zeit
stunden = differenz.total_seconds() / 3600
messagebox.showinfo("Gesamtstunden", f"Gesamtstunden heute: {stunden:.2f}")
else:
messagebox.showwarning("Fehler", "Keine vollständigen Daten für heute verfügbar.")
except Exception as e:
messagebox.showerror("Fehler", f"Ein Fehler ist aufgetreten: {str(e)}")
# Hauptfenster erstellen
root = Tk()
root.geometry("400x400")
root.title("Arbeitszeiterfassung")
# Label für das Datum hinzufügen
datum_label = Label(root, text="", font=("Helvetica", 16))
datum_label.pack(pady=10)
# Label für die Zeit hinzufügen
zeit_label = Label(root, text="", font=("Helvetica", 16))
zeit_label.pack(pady=10)
# Radio Buttons zur Auswahl des Tagestyps in einem LabelFrame gruppieren
auswahl_frame = LabelFrame(root, text="Tagestyp auswählen", font=("Helvetica", 14))
auswahl_frame.pack(pady=10, padx=10, fill="both", expand="yes")
# Variable zur Speicherung der Auswahl
auswahl = StringVar()
auswahl.set("Arbeitstag") # Standardauswahl
rb1 = Radiobutton(auswahl_frame, text="Arbeitstag", variable=auswahl, value="Arbeitstag")
rb1.pack(anchor=W)
rb2 = Radiobutton(auswahl_frame, text="Urlaubstag", variable=auswahl, value="Urlaubstag")
rb2.pack(anchor=W)
rb3 = Radiobutton(auswahl_frame, text="Krankentag", variable=auswahl, value="Krankentag")
rb3.pack(anchor=W)
# Buttons hinzufügen und mit Funktionen verknüpfen
kommen_button = Button(root, text="Kommen", command=kommen, font=("Helvetica", 14))
kommen_button.pack(pady=10)
gehen_button = Button(root, text="Gehen", command=gehen, font=("Helvetica", 14))
gehen_button.pack(pady=10)
gesamtstunden_button = Button(root, text="Gesamtstunden anzeigen", command=gesamtstunden, font=("Helvetica", 12))
gesamtstunden_button.pack(pady=10)
# Starte die Funktion zur Anzeige des Datums und der aktuellen Zeit
datum_und_zeit_anzeigen()
# Hauptloop starten
root.mainloop()