diff --git a/src/gui.py b/src/gui.py index 0892f00..c8f13e3 100644 --- a/src/gui.py +++ b/src/gui.py @@ -68,7 +68,7 @@ class DHCPApp(tk.Frame): # Zeile 0 ttk.Label(form, text="Interface:").grid(row=0, column=0, sticky="w") self.if_var = tk.StringVar() - self.if_menu = ttk.OptionMenu(form, self.if_var, None, *utils.get_network_interfaces(), command=self.on_iface_change) + self.if_menu = ttk.OptionMenu(form, self.if_var, None, command=self.on_iface_change) self.if_menu.grid(row=0, column=1, sticky="ew", padx=(6, 16)) form.columnconfigure(1, weight=1) @@ -98,8 +98,10 @@ class DHCPApp(tk.Frame): btns.pack(fill="x", pady=(8, 8)) self.btn_start = ttk.Button(btns, text="Start", command=self.start_server) self.btn_stop = ttk.Button(btns, text="Stop", command=self.stop_server, state="disabled") + self.btn_rescan = ttk.Button(btns, text="Interfaces neu scannen", command=self.rescan_interfaces) self.btn_start.pack(side="left") self.btn_stop.pack(side="left", padx=(8, 0)) + self.btn_rescan.pack(side="left", padx=(8, 0)) # --- Clients & Logs Paned Layout --- paned = ttk.Panedwindow(self, orient="horizontal") @@ -122,11 +124,7 @@ class DHCPApp(tk.Frame): status = ttk.Label(self, textvariable=self.status_var, anchor="w", relief="sunken") status.pack(fill="x", side="bottom") - # initial iface autofill (if any interface exists) - ifaces = utils.get_network_interfaces() - if ifaces: - self.if_var.set(ifaces[0]) - self.on_iface_change(ifaces[0]) + self._refresh_interface_list(initial=True) # periodic refresh self.after(400, self._refresh) @@ -134,7 +132,12 @@ class DHCPApp(tk.Frame): # -------------------- UI logic -------------------- def on_iface_change(self, _sel=None): iface = self.if_var.get().strip() + if not iface: + self._clear_iface_fields() + return + ip, mask = utils.get_iface_ipv4_config(iface) + self._clear_iface_fields() if ip: self.ip_var.set(ip) # sinnvolles Default: Primary DNS = Interface-IP @@ -150,9 +153,51 @@ class DHCPApp(tk.Frame): self.mask_entry.configure(state=state) self.dns1_entry.configure(state=state) self.dns2_entry.configure(state=state) + self.btn_rescan.configure(state=state) self.btn_start.configure(state="normal" if enabled else "disabled") self.btn_stop.configure(state="disabled" if enabled else "normal") + def _clear_iface_fields(self) -> None: + self.ip_var.set("") + self.mask_var.set("") + self.dns1_var.set("") + self.dns2_var.set("") + + def _select_iface(self, iface: str) -> None: + self.if_var.set(iface) + self.on_iface_change(iface) + + def _refresh_interface_list(self, initial: bool = False) -> None: + interfaces = utils.get_network_interfaces() + current = self.if_var.get().strip() + menu = self.if_menu["menu"] + menu.delete(0, "end") + for iface in interfaces: + menu.add_command(label=iface, command=lambda val=iface: self._select_iface(val)) + + if current in interfaces: + selection = current + elif interfaces: + selection = interfaces[0] + else: + selection = "" + + if selection: + self._select_iface(selection) + if not initial: + self.status_var.set(f"{len(interfaces)} Interface(s) geladen.") + else: + self.if_var.set("") + self._clear_iface_fields() + if not initial: + self.status_var.set("Keine Netzwerk-Interfaces gefunden.") + + def rescan_interfaces(self) -> None: + if self.server and self.server.is_running(): + messagebox.showinfo("Server läuft", "Stoppe den Server, bevor du Interfaces neu scannst.") + return + self._refresh_interface_list() + def start_server(self) -> None: if self.server and self.server.is_running(): messagebox.showinfo("Info", "Server läuft bereits.")