- Python 100%
| icons | ||
| .gitignore | ||
| config.py | ||
| crea_icone.py | ||
| ftp_config.json | ||
| ftp_manager.spec | ||
| ftp_server.py | ||
| gui.py | ||
| logger.py | ||
| main.py | ||
| main.spec | ||
| README.md | ||
| requirements.txt | ||
| tray.py | ||
| tray01.py | ||
ftp-manager
Codice rielaborato da ChetGPT
🧩 1. Librerie Python necessarie
Queste sono tutte le dipendenze richieste dal progetto, alcune dirette e altre implicite:
Libreria Descrizione Necessaria su pyftpdlib Server FTP integrato in Python Tutto FreeSimpleGUI (o PySimpleGUI compatibile) Interfaccia grafica cross-platform Tutto Pillow Generazione icone tray Tutto pystray Tray icon su Windows e Linux (X11) Windows / X11 PyGObject (gi + AppIndicator3) Tray icon su Wayland Fedora / Wayland pyinstaller Creazione eseguibile standalone Facoltativo per build setuptools, wheel Compilazione pacchetti Tutto 💻 2. Installazione in ambiente virtuale
Apri una shell e crea un ambiente pulito:
python3 -m venv venv source venv/bin/activate # Su Linux/macOS
venv\Scripts\activate # Su Windows
Poi installa le dipendenze base:
pip install --upgrade pip setuptools wheel pip install pyftpdlib FreeSimpleGUI Pillow pystray 🧠 Linux (Fedora Workstation / Wayland)
Su Fedora è necessario installare anche i pacchetti di sistema per le binding GTK:
sudo dnf install python3-gobject libappindicator-gtk3
Poi nel virtualenv:
pip install PyGObject
✅ Questo fornisce gi.repository.AppIndicator3 usato dal codice per la tray su Wayland. ⚠️ Nota: su Wayland pystray non funziona, perciò AppIndicator è essenziale.
🪟 Windows 10 / 11
Su Windows basta:
pip install pystray pillow pyftpdlib FreeSimpleGUI
(PyGObject non è necessario e non funziona su Windows.)
⚙️ 3. File requirements.txt completo
Crea un file requirements.txt così:
FreeSimpleGUI>=4.60 pyftpdlib>=1.5.9 pystray>=0.19.5 Pillow>=10.0.0 PyGObject; platform_system == "Linux"
E installalo con:
pip install -r requirements.txt 🧱 4. Compilazione con PyInstaller
Installa PyInstaller nel virtualenv:
pip install pyinstaller
Poi compila il progetto:
pyinstaller --noconfirm --onefile --windowed main.py Opzioni raccomandate: Parametro Significato --onefile Un solo file .exe / binario --windowed Nessuna finestra console nera --icon=icon.ico (facoltativo) aggiunge un’icona personalizzata --add-data "ftp_manager/*;ftp_manager/" include i moduli se li tieni in sottocartella
Esempio completo:
pyinstaller --noconfirm --onefile --windowed
--add-data "ftp_manager/*;ftp_manager/"
--icon=ftp_manager.ico main.py
📦 L’eseguibile sarà in:
dist/main.exe (Windows) dist/main (Linux) 🧪 5. Test del programma in virtualenv
Esegui da shell:
python main.py
Verifica che:
si apra la GUI, il tray mostri l’icona (verde/rossa), il server FTP risponda (ftp://localhost:2121), il log venga scritto in ftp_manager.log. 🔍 6. Problemi noti e soluzioni Problema Soluzione Su Fedora il tray non appare assicurati che libappindicator-gtk3 sia installato Su GNOME con Wayland, nessuna tray visibile installa estensione “AppIndicator Support” da GNOME Extensions Icone mancanti o corrotte in build PyInstaller aggiungi --collect-data Pillow --collect-data pystray alla build Su Windows appare console nera aggiungi --windowed alla build “no module named gi.repository” installa PyGObject e libappindicator-gtk3 ✅ Riassunto rapido Passo Comando Crea virtualenv python3 -m venv venv && source venv/bin/activate Installa dipendenze pip install -r requirements.txt Testa in Python python main.py Crea eseguibile pyinstaller --onefile --windowed main.py
1️⃣ Installazione PyInstaller
Assicurati di avere l’ambiente virtuale attivo e installa PyInstaller:
pip install pyinstaller 2️⃣ Comando base per creare l’eseguibile Windows pyinstaller --onefile --noconsole --icon=ftp_icon.ico main.py --onefile → Crea un singolo .exe. --noconsole → Non apre la console (solo GUI). --icon → Icona opzionale per l’eseguibile (puoi usare la tua icona .ico). Linux pyinstaller --onefile --windowed main.py --windowed → Disabilita la console terminale per GUI. 3️⃣ Inclusione dipendenze specifiche
Per il tuo progetto, devi includere:
Pillow → per le icone pyftpdlib → server FTP FreeSimpleGUI → GUI pystray → tray su Windows/Linux X11 gi / AppIndicator3 → tray su Linux Wayland threading, tempfile, time, os, json, logging → builtin
PyInstaller normalmente rileva le dipendenze, ma gi a volte richiede un hook. Puoi aggiungere manualmente con --hidden-import:
pyinstaller --onefile --windowed main.py
--hidden-import=gi.repository.Gtk
--hidden-import=gi.repository.AppIndicator3
4️⃣ Directory e risorse extra
Se vuoi includere:
Icone File di configurazione iniziale (ftp_config.json)
Usa il parametro --add-data:
pyinstaller --onefile --windowed main.py
--add-data "ftp_config.json:."
--add-data "ftp_icon.ico:."
--hidden-import=gi.repository.Gtk
--hidden-import=gi.repository.AppIndicator3
Sintassi Linux/macOS: "source:destination" Sintassi Windows: "source;destination"
5️⃣ Note importanti Su Linux, AppIndicator3 richiede di avere installato i pacchetti di sistema: sudo dnf install python3-gobject gtk3 libappindicator-gtk3 Su Windows, pystray funziona senza librerie esterne. L’eseguibile creato con --onefile include tutto, quindi puoi spostarlo senza installare Python.
- Pre-requisiti (ambiente di build)
Assumi che tu stia nella cartella del progetto (ftp_manager/) e che tu abbia un virtualenv attivo:
python -m venv venv source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
pip install --upgrade pip setuptools wheel pip install pyinstaller pyftpdlib Pillow pystray FreeSimpleGUI
Se su Linux vuoi usare AppIndicator (Wayland), installa:
sudo dnf install python3-gobject libappindicator-gtk3
poi nel venv:
pip install PyGObject
⚠️ Nota importante su Linux/gi (PyGObject): PyGObject è legato a librerie di sistema; spesso è necessario installare i pacchetti di sistema (python3-gobject, gtk3, libappindicator-gtk3) prima di bundlarlo / eseguire l'app. L'eseguibile può richiedere dipendenze di sistema quando distribuito.
- Verifica locale prima di build
Esegui sempre in venv per testare:
python main.py
Accertati che GUI si apra, che il tray funzioni (chiudi finestra — applicazione resta in tray) e che le icone siano presenti in icons/ o vengano generate.
- Comando PyInstaller rapido (consigliato per test)
Esegui da ftp_manager/ con venv attivo.
Linux (test / onefile)
pyinstaller --onefile --windowed
--add-data "icons:icons"
--add-data "ftp_config.json:."
--hidden-import=pystray
--hidden-import=PIL
main.py
Windows (test / onefile)
pyinstaller --onefile --noconsole ^
--add-data "icons;icons" ^
--add-data "ftp_config.json;." ^
--hidden-import=pystray ^
--hidden-import=PIL ^
main.py
--add-data include le icone e il file di config nella cartella dell’eseguibile.
--hidden-import aiuta PyInstaller a non perdere import dinamici (PIL/pystray/gi).
Su Windows separa con ;, su Linux con : (attenzione alle shell quoting).
- Problemi/considerazioni specifiche e soluzioni A) gi.repository / AppIndicator su Linux Non includere il C-library libappindicator nello onefile; è una libreria di sistema. L’eseguibile può eseguirsi su macchine che abbiano i pacchetti di sistema corretti.
Se l’app fallisce su un sistema target per mancanza di gi, istruisci gli utenti a installare:
sudo dnf install python3-gobject libappindicator-gtk3 gtk3
(o il corrispondente apt su Debian/Ubuntu)
B) Icone non aggiornate su AppIndicator Per Wayland/AppIndicator usiamo file diversi (nuovo file ogni update) o set_icon con file path differente. Il codice che ti ho dato genera / aggiorna i file in icons/, e la build li include. C) PyInstaller non trova import dinamici Aggiungi --hidden-import=gi.repository.Gtk e --hidden-import=gi.repository.AppIndicator3 se vedi errori di import mancanti durante test. D) File di configurazione esterno Se vuoi che l’utente modificabile ftp_config.json resti esterno (non dentro l’exe), non includerlo con --add-data e distribuiscilo insieme all’exe. L’app proverà a creare il file di default se non presente.
- Esempio completo di comandi di build consigliati
Linux (consigliato: test build)
attiva venv
source venv/bin/activate
build onefile (test)
pyinstaller --onefile --windowed
--add-data "icons:icons"
--add-data "ftp_config.json:."
--hidden-import=pystray
--hidden-import=PIL
main.py
Windows (PowerShell)
venv\Scripts\activate
pyinstaller --onefile --noconsole --add-data "icons;icons"
--add-data "ftp_config.json;." --hidden-import=pystray
--hidden-import=PIL `
main.py
7) Test post-build
Controlla dist/ftp_manager (su Linux) o dist/ftp_manager.exe (su Windows).
Avvia l’eseguibile ./dist/ftp_manager e verifica:
GUI si apre
Chiudendo la finestra (X) l’app resta in tray
Menu tray -> Esci termina l’app
Avvia/ferma server cambia icona nella tray