# ============================= # app/simulation/ui/gearbox.py # ============================= from __future__ import annotations import tkinter as tk from tkinter import ttk from typing import Dict, Any, List from app.simulation.ui import UITab class GearboxTab(UITab): NAME = "gearbox" TITLE = "Getriebe" PRIO = 10 def __init__(self, parent, sim): self.sim = sim self.frame = ttk.Frame(parent, padding=8) self.frame.columnconfigure(1, weight=1) ttk.Label(self.frame, text="Gänge (inkl. Leerlauf als 0)").grid(row=0, column=0, sticky="w") self.gears_var = tk.IntVar(value=6) ttk.Spinbox(self.frame, from_=1, to=10, textvariable=self.gears_var, width=6, command=self._rebuild_ratios).grid(row=0, column=1, sticky="w") self.reverse_var = tk.BooleanVar(value=False) ttk.Checkbutton(self.frame, text="Rückwärtsgang vorhanden", variable=self.reverse_var).grid(row=1, column=0, columnspan=2, sticky="w") ttk.Label(self.frame, text="km/h pro 1000 RPM je Gang").grid(row=2, column=0, sticky="w", pady=(6,0)) self.ratio_frame = ttk.Frame(self.frame); self.ratio_frame.grid(row=3, column=0, columnspan=2, sticky="ew") self.ratio_vars: List[tk.DoubleVar] = [] self._rebuild_ratios() ttk.Button(self.frame, text="Anwenden", command=self.apply).grid(row=4, column=0, pady=(8,0), sticky="w") def _rebuild_ratios(self): for w in self.ratio_frame.winfo_children(): w.destroy() self.ratio_vars.clear() n = int(self.gears_var.get()) for i in range(1, n+1): ttk.Label(self.ratio_frame, text=f"Gang {i}").grid(row=i-1, column=0, sticky="w") v = tk.DoubleVar(value= [12.0,19.0,25.0,32.0,38.0,45.0][i-1] if i-1 < 6 else 45.0) ttk.Entry(self.ratio_frame, textvariable=v, width=8).grid(row=i-1, column=1, sticky="w", padx=(6,12)) self.ratio_vars.append(v) def apply(self): ratios = [float(v.get()) for v in self.ratio_vars] cfg = {"gearbox": { "num_gears": int(self.gears_var.get()), "reverse": bool(self.reverse_var.get()), "kmh_per_krpm": [0.0] + ratios # index 0 reserved for neutral }} self.sim.load_config(cfg) def save_into_config(self, out: Dict[str, Any]) -> None: out.setdefault("gearbox", {}) out["gearbox"].update({ "num_gears": int(self.gears_var.get()), "reverse": bool(self.reverse_var.get()), "kmh_per_krpm": [0.0] + [float(v.get()) for v in self.ratio_vars] }) def load_from_config(self, cfg: Dict[str, Any]) -> None: g = cfg.get("gearbox", {}) n = int(g.get("num_gears", self.gears_var.get())) self.gears_var.set(n); self.reverse_var.set(g.get("reverse", self.reverse_var.get())) self._rebuild_ratios() ratios = g.get("kmh_per_krpm") or ([0.0] + [v.get() for v in self.ratio_vars]) for i, v in enumerate(self.ratio_vars, start=1): try: v.set(float(ratios[i])) except Exception: pass self.sim.load_config(cfg)