Files
objekt-orientierung/tippen.py
T
2026-09-21 15:24:35 +02:00

158 lines
5.1 KiB
Python

import time
import tkinter as tk
# Konstanten für die physikalische Umrechnung (laut unserer Formel)
# 1 Anschlag = 0.0025 Meter auf dem Bildschirm
# 7 Knoten = 3.6 Meter/Sekunde = 1440 Anschläge/Sekunde
# Daraus ergibt sich der Umrechnungsfaktor: Knoten = (Anschläge_pro_Sekunde * 0.0025) / 0.51444
METER_PRO_ANSCHLAG = 0.5
KNOTEN_IN_MPS = 0.51444 # 1 Knoten = 0.51444 m/s
class BootTipptest:
def __init__(self, root):
self.root = root
self.root.title("Der maritime 7-Knoten-Tipptest ⛵")
self.root.geometry("800x500")
self.root.configure(bg="#e0f7fa")
# Test-Text
self.test_text = "Seemannsgarn oder Weltrekord? Wer mit sieben Knoten auf der Tastatur tippen will, muss die Finger fliegen lassen wie der Wind auf hoher See. Ahoi und feuer frei!"
self.start_zeit = None
self.tippen_aktiv = False
# UI Elemente bauen
self.create_widgets()
def create_widgets(self):
# Titel
title = tk.Label(
self.root,
text="Der maritime Tipp-O-Meter",
font=("Arial", 20, "bold"),
bg="#e0f7fa",
fg="#006064",
)
title.pack(pady=10)
# Der Text, den man abtippen muss
text_label = tk.Label(
self.root,
text=self.test_text,
font=("Arial", 12, "italic"),
wraplength=700,
bg="#ffffff",
fg="#37474f",
bd=2,
relief="groove",
padx=10,
pady=10,
)
text_label.pack(pady=10)
# Das "Meer" (Canvas) für das Boot
self.canvas = tk.Canvas(
self.root, width=700, height=80, bg="#0288d1", highlightthickness=0
)
self.canvas.pack(pady=15)
# Ziellinie und Wellen-Deko
self.canvas.create_line(
650, 0, 650, 80, fill="#ffeb3b", width=3, dash=(5, 3)
)
self.canvas.create_text(
650, 15, text="ZIEL", fill="#ffeb3b", font=("Arial", 10, "bold")
)
# Das digitale Boot (als Text-Emoji)
self.boot = self.canvas.create_text(
30, 40, text="⛵", font=("Arial", 30)
)
# Live-Anzeige für die Geschwindigkeit
self.tacho_label = tk.Label(
self.root,
text="Geschwindigkeit: 0.00 Knoten",
font=("Arial", 16, "bold"),
bg="#e0f7fa",
fg="#d32f2f",
)
self.tacho_label.pack(pady=5)
# Eingabefeld für den User
self.entry = tk.Entry(
self.root, font=("Arial", 14), width=60, bd=3, relief="sunken"
)
self.entry.pack(pady=10)
self.entry.bind("<KeyRelease>", self.prüfe_eingabe)
# Reset Button
self.reset_button = tk.Button(
self.root,
text="Nochmal versuchen",
command=self.reset_test,
font=("Arial", 10, "bold"),
bg="#00897b",
fg="white",
)
self.reset_button.pack(pady=10)
def prüfe_eingabe(self, event):
aktuelle_eingabe = self.entry.get()
# Zeitmessung starten beim ersten Tastendruck
if not self.tippen_aktiv and len(aktuelle_eingabe) > 0:
self.start_zeit = time.time()
self.tippen_aktiv = True
if self.tippen_aktiv:
vergangene_zeit = time.time() - self.start_zeit
if vergangene_zeit == 0:
vergangene_zeit = 0.01
anschläge = len(aktuelle_eingabe)
# --- DIE KNOTEN-BERECHNUNG ---
anschläge_pro_sekunde = anschläge / vergangene_zeit
meter_pro_sekunde = anschläge_pro_sekunde * METER_PRO_ANSCHLAG
knoten = meter_pro_sekunde / KNOTEN_IN_MPS
# Tacho aktualisieren
if aktuelle_eingabe == self.test_text:
self.tacho_label.config(
text=f"Geschwindigkeit: {knoten:.2f} Knoten"
)
else:
self.tacho_label.config(
text=f"⚠️Fehler!! Geschwindigkeit: {knoten:.2f} Knoten⚠️"
)
# Boot auf dem Bildschirm bewegen (maximal bis zum Ziel bei Pixel 650)
fortschritt = len(aktuelle_eingabe) / len(self.test_text)
neues_x = 30 + (fortschritt * 620)
self.canvas.coords(self.boot, min(neues_x, 650), 40)
# Prüfen, ob der Text komplett richtig eingetippt wurde
if aktuelle_eingabe == self.test_text:
self.tippen_aktiv = False
self.entry.config(state="disabled")
self.tacho_label.config(
text=f"🏁 ZIEL! Deine Endgeschwindigkeit: {knoten:.2f} Knoten!"
)
def reset_test(self):
self.entry.config(state="normal")
self.entry.delete(0, tk.END)
self.canvas.coords(self.boot, 30, 40)
self.tacho_label.config(text="Geschwindigkeit: 0.00 Knoten")
self.start_zeit = None
self.tippen_aktiv = False
if __name__ == "__main__":
root = tk.Tk()
app = BootTipptest(root)
root.mainloop()