67 lines
3.0 KiB
Python
67 lines
3.0 KiB
Python
# =============================
|
|
# app/tabs/gearbox.py
|
|
# =============================
|
|
|
|
from __future__ import annotations
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
from typing import Dict, Any, List
|
|
|
|
class GearboxTab:
|
|
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)
|