import subprocess import threading import tkinter as tk from tkinter import messagebox, scrolledtext SCRIPT_PATH = "../start-stack.sh" class StackLauncher(tk.Tk): def __init__(self): super().__init__() self.title("Traduttore Stack Helper") self.geometry("600x360") self.resizable(False, False) btn_frame = tk.Frame(self) btn_frame.pack(padx=12, pady=8, fill=tk.X) self.start_button = tk.Button(btn_frame, text="Avvia stack completo", command=self.start_stack) self.start_button.pack(side=tk.LEFT, padx=(0, 8)) self.status_label = tk.Label(btn_frame, text="Stato: inattivo", anchor="w") self.status_label.pack(side=tk.LEFT, fill=tk.X, expand=True) self.log_text = scrolledtext.ScrolledText(self, state="disabled", wrap=tk.WORD) self.log_text.pack(fill=tk.BOTH, expand=True, padx=12, pady=(0, 12)) self.process = None def start_stack(self): if self.process and self.process.poll() is None: messagebox.showinfo("In esecuzione", "Lo stack è già in fase di avvio.") return self.start_button.config(state="disabled") self.status_label.config(text="Stato: avvio"); self.log_text.configure(state="normal") self.log_text.delete("1.0", tk.END) self.log_text.configure(state="disabled") thread = threading.Thread(target=self._run_script, daemon=True) thread.start() self.after(200, self._poll_process) def _run_script(self): self.process = subprocess.Popen( ["/bin/bash", "start-stack.sh"], cwd="..", stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1, ) if not self.process.stdout: return for line in self.process.stdout: self._append_log(line) self.process.wait() self._append_log(f"Processo terminato con codice {self.process.returncode}\n") def _poll_process(self): if self.process and self.process.poll() is None: self.after(200, self._poll_process) else: self.start_button.config(state="normal") status = "completato" if self.process and self.process.returncode == 0 else "errore" self.status_label.config(text=f"Stato: {status}") def _append_log(self, value: str) -> None: self.log_text.configure(state="normal") self.log_text.insert(tk.END, value) self.log_text.see(tk.END) self.log_text.configure(state="disabled") if __name__ == "__main__": app = StackLauncher() app.mainloop()