Beispiel Zeiterfassung

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()