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