FlashGui 0.1.6

App desktop Python in 3 righe. Componenti pronti, finestra personalizzabile, API uniforme.

7
Moduli
20+
Widget WINDOW
2
Dipendenze Totali

FlashGui è una libreria Python che ti offre calcolatrice, blocco note, paint, orologio, calendario, ricerca file già funzionanti con una riga di codice, più un componente WINDOW ad alto livello per costruire qualsiasi interfaccia usando coordinate proporzionali (0.0 → 1.0) e font che si ridimensionano automaticamente. Ogni modulo supporta temi light e dark, personalizzazione completa via Edit(), logica iniettabile via Logic() e un set di API comuni (timer, clipboard, HTTP asincrono).

Installazione

$ pip install FlashGui
Richiede Python 3.9+ e wxPython 4.2+. Installa anche charset-normalizer (usato da NOTEPAD e WINDOW per aprire file con encoding automatico).

Novità in 0.1.6

✦ Changelog 0.1.6

  • SEARCHER — nuovo modulo per cercare file e cartelle in modo ricorsivo, con UI completa, filtri tipo e stato in tempo reale.
  • API comuni su tutti i moduliAddRepeatTimer, DelTimer, CopyToClipboard, GetClipboardText, SendRequest (HTTP asincrono) ora disponibili su CALCULATOR, NOTEPAD, PAINT, CLOCK, CALENDAR, WINDOW.
  • CALCULATOR — aggiunto Evaluate(), SetText(), AppendText(), GetText(), Clear().
  • CLOCK — aggiunto ShowClock(), ShowTimer(), ShowStopwatch(), GetTime(), GetDate(), GetElapsed().
  • CALENDAR — aggiunto NextMonth(), PrevMonth(), GoToToday(), get_selected_date(), go_to_date(), set_info_text().
  • NOTEPAD — aggiunto GetText(), SetText(), AppendText(), GetSelectedText(), SetFont().
  • PAINT — aggiunto GetCurrentColor(), SetCurrentColor(), GetCurrentWidth(), SetCurrentWidth(), LoadImage(), GetSnapshot().
  • WINDOW — aggiunto add_combobox, add_spinctrl, add_separator, add_image, add_menu, dialogs (ShowInputDialog, ShowYesNoDialog, OpenFolderDialog), file helpers (LoadTextFromFile, SaveTextToFile), BindKey, gestione finestra (SetTitle, Minimize, Maximize, Restore, SetOpacity, SetIcon), SetCloseHandler, exit().

Parametri del costruttore (tutti i moduli)

Tutti i moduli ad eccezione di WINDOW condividono gli stessi parametri di inizializzazione:

ParametroTipoDefaultDescrizione
titlestr"…"Titolo della finestra OS
sizetuple(float,float)(2,2)Divisore della risoluzione schermo: screen_w/size[0] × screen_h/size[1]
colortuple(R,G,B)(240,240,240)Colore di sfondo della finestra. Ignorato se style="dark"
iconstr|NoneNonePercorso a icona .png o .ico
maximizedboolFalseAvvia la finestra massimizzata
min_sizetuple(5,4)Dimensione minima come divisore di schermo
max_sizetuple(1,1)Dimensione massima. (1,1) = full screen
stylestr"light""light" o "dark" — applica il tema globale

WINDOW usa invece size=(800,600) in pixel assoluti e min_size/max_size come pixel o float 0→1.

🧮
CALCULATOR
Calcolatrice completa con display, griglia numerica e operatori, tema chiaro/scuro, ogni pulsante personalizzabile.
from FlashGui import CALCULATOR

calc = CALCULATOR(
    title="Calculator",
    size=(3, 2),
    color=(240, 240, 240),
    icon=None,
    maximized=False,
    min_size=(5, 4),
    max_size=(1, 1),
    style="light"  # oppure "dark"
)
calc.run()

Metodo Logic()

Permette di iniettare callback personalizzati per ogni pulsante. Se un callback è None il pulsante usa il comportamento default (calcolo, cancella, backspace).

ParametroTipoDefaultAttivato da
button_0_command … button_9_commandcallable|NoneNonePulsanti 0–9
button_dot_commandcallable|NoneNonePulsante .
button_plus_commandcallable|NoneNone+
button_minus_commandcallable|NoneNone-
button_mul_commandcallable|NoneNone*
button_div_commandcallable|NoneNone/
button_eq_commandcallable|NoneNone= (default: eval)
button_C_commandcallable|NoneNoneC (default: clear)
button_DEL_commandcallable|NoneNoneDEL (default: backspace)

Metodo Edit()

Personalizza colori, testi e stile di tutti i pulsanti e del display.

ParametroDefaultDescrizione
button_N_bg / button_N_fg(240,240,240) / (0,0,0)Colori sfondo/testo pulsanti 0–9, dot, +, -, *, /
button_N_text"N"Etichetta del pulsante N
button_C_bg / button_C_fg / button_C_text(240,240,240)/(0,0,0)/"C"Pulsante Clear
button_DEL_bg / button_DEL_fg / button_DEL_text–/"DEL"Pulsante Backspace
button_eq_bg / button_eq_fg / button_eq_text(0,120,215)/(255,255,255)/"="Pulsante uguale
entry_bg_color / entry_text_color(240,240,240)/(0,0,0)Colori del display
message_error"Error"Testo mostrato in caso di errore nel calcolo

Metodi di testo AGGIORNATO

GetText() → str
Restituisce il valore attuale del display.
SetText(text="")
Imposta il display e l'espressione interna al valore specificato.
AppendText(text="")
Aggiunge testo in coda al display e all'espressione interna.
Clear()
Svuota display ed espressione.
Evaluate(expr=None) → str|None
Valuta expr (o l'espressione corrente) con eval(), mostra il risultato nel display e lo restituisce. In caso di errore restituisce None e mostra message_error.

📘 Esempio

from FlashGui import CALCULATOR

calc = CALCULATOR(title="Calcolatrice personalizzata", style="dark")
calc.Edit(button_eq_bg=(0,200,100), button_eq_fg=(0,0,0), message_error="Errore!")

def on_equal():
    result = calc.Evaluate()
    calc.CopyToClipboard(result)  # copia il risultato negli appunti

calc.Logic(button_eq_command=on_equal)
calc.run()
📝
NOTEPAD
Editor di testo completo con menu personalizzato, status bar, apertura/salvataggio file con auto-rilevamento encoding.
from FlashGui import NOTEPAD

nota = NOTEPAD(title="Mio Blocco Note", size=(2,2), style="dark")
nota.run()

Metodo Logic()

ParametroDescrizione
menu_new_commandOverride File → Nuovo (default: svuota editor)
menu_open_commandOverride File → Apri (default: dialog apertura file)
menu_save_commandOverride File → Salva
menu_save_as_commandOverride File → Salva come
menu_exit_commandOverride File → Esci
menu_about_commandOverride Aiuto → Informazioni
menu_undo_commandOverride Modifica → Annulla
menu_redo_commandOverride Modifica → Ripristina
menu_cut_commandOverride Modifica → Taglia
menu_copy_commandOverride Modifica → Copia
menu_paste_commandOverride Modifica → Incolla
menu_select_all_commandOverride Modifica → Seleziona tutto
popup_cut/copy/paste/select_all_commandOverride stesso comportamento nel menu contestuale (tasto destro)

Metodo Edit() — principali parametri

ParametroDescrizione
new_text, open_text, save_text, saveas_text, exit_text, about_textEtichette voci di menu File/Help
undo_text, redo_text, cut_text, copy_text, paste_text, selectall_textEtichette voci menu Modifica
file_menu_text, edit_menu_text, help_menu_textIntestazioni menu bar
bg_color, text_ctrl_bg, text_ctrl_fgColori area testo
menubar_bg, menubar_fg, menubar_hoverColori menu bar
menu_bg, menu_fg, menu_hover, menu_radiusColori popup menu a tendina
statusbar_bg, statusbar_fg, statusbar_separator_colorColori status bar
open_dialog_title / open_dialog_file_typeTitolo e tipi file del dialog di apertura
save_as_dialog_title / save_as_dialog_file_typeTitolo e tipi del dialog Salva come
messagebox_about_title / messagebox_about_textFinestra Informazioni
maybe_save_dialog_title / maybe_save_dialog_textMessaggio "vuoi salvare prima di uscire?"
popup_cut_text, popup_copy_text, popup_paste_text, popup_select_all_textVoci menu contestuale
ln_text, col_text, words_text, chars_textEtichette status bar (riga, colonna, parole, caratteri)
untitled_textTesto del titolo quando il file non ha nome

Metodi testo AGGIORNATO

GetText() → str
Restituisce l'intero contenuto dell'editor.
SetText(text="")
Sostituisce il contenuto dell'editor con text.
AppendText(text="")
Aggiunge testo in fondo all'editor.
GetSelectedText() → str
Restituisce il testo attualmente selezionato (stringa vuota se nulla è selezionato).
SetFont(size=12, family="teletype", bold=False)
Cambia il font dell'editor. family: "teletype", "default", "swiss", "roman", "modern".

📘 Esempio

from FlashGui import NOTEPAD

nota = NOTEPAD(title="Editor Markdown", size=(2,2), style="dark")
nota.Edit(
    file_menu_text="File", edit_menu_text="Modifica", help_menu_text="Aiuto",
    text_ctrl_bg=(25,25,25), text_ctrl_fg=(200,255,200),
    statusbar_bg=(20,20,20), statusbar_fg=(150,150,150),
    untitled_text="nuovo file"
)
nota.SetFont(size=14, family="default")
nota.AppendText("# Benvenuto!\n")
nota.run()
🎨
PAINT
Programma di disegno con pennello, gomma, secchio, linea, cerchio, rettangolo, color picker e slider larghezza. Salvataggio PNG/JPG.
from FlashGui import PAINT

paint = PAINT(title="Mio Paint", size=(2,2), style="light")
paint.run()

Metodo Logic()

ParametroDefaultDescrizione
current_tool"brush"Strumento attivo al lancio. Valori: "brush", "eraser", "line", "circle", "rect", "bucket"
color_picker_start_color(0,0,0)Colore iniziale del pennello
slider_start_value5Valore iniziale dello slider larghezza
slider_from_value0Valore minimo slider
slider_to_value100Valore massimo slider
brush_button_commandNoneCallback pulsante Brush
eraser_button_commandNoneCallback pulsante Eraser
line_button_commandNoneCallback pulsante Line
circle_button_commandNoneCallback pulsante Circle
rect_button_commandNoneCallback pulsante Rectangle
bucket_button_commandNoneCallback pulsante Bucket
clear_button_commandNoneCallback pulsante Clear
save_button_commandNoneCallback pulsante Save (sovrascrive il comportamento di default)

Metodo Edit() — principali parametri

ParametroDescrizione
brush/eraser/bucket/line/circle/rect_button_bg/fgColori sfondo/testo di ogni pulsante strumento
clear_button_bg/fg, save_button_bg/fgColori pulsanti Clear e Save
brush/eraser/…_button_textEtichette dei pulsanti strumento
clear_button_text, save_button_textEtichette Clear/Save
width_textEtichetta dello slider larghezza (default "Width")
canvas_bgColore sfondo canvas
toolbar_panel_bgColore sfondo toolbar
title_save_imageTitolo del dialog di salvataggio
text_file_png, text_file_jpgDescrizioni tipo file nel dialog di salvataggio

Metodi canvas AGGIORNATO

GetCurrentColor() → (R,G,B)
Restituisce il colore attuale del pennello come tupla RGB.
SetCurrentColor(color)
Imposta il colore del pennello. Accetta tupla RGB o stringa hex.
GetCurrentWidth() → int
Restituisce il valore attuale dello slider larghezza.
SetCurrentWidth(width)
Imposta il valore dello slider larghezza e aggiorna l'etichetta.
LoadImage(path) → bool
Carica un'immagine su canvas (sostituisce il contenuto attuale). Restituisce True se il file esiste.
GetSnapshot(path=None) → wx.Bitmap|None
Restituisce il canvas come wx.Bitmap. Se path è fornito (con estensione .png o .jpg), salva anche su disco.

📘 Esempio

from FlashGui import PAINT

paint = PAINT(title="Disegna", style="dark")
paint.Logic(current_tool="brush", color_picker_start_color=(255,100,100), slider_start_value=8)
paint.Edit(canvas_bg=(30,30,30), width_text="Spessore", title_save_image="Salva immagine")

def on_save(event):
    paint.GetSnapshot("output.png")

paint.Logic(save_button_command=on_save)
paint.run()
CLOCK
Tre pannelli navigabili: Orologio (HH:MM:SS + data), Timer con spinner h/m/s, Cronometro con centesimi.
from FlashGui import CLOCK

clock = CLOCK(title="Orologio", size=(2,2), style="dark")
clock.run()

Metodo Logic()

ParametroDescrizione
nav_clock_commandOverride click tab CLOCK (default: mostra pannello orologio)
nav_timer_commandOverride click tab TIMER
nav_stopwatch_commandOverride click tab STOPWATCH
timer_start_commandOverride pulsante START del timer
timer_reset_commandOverride pulsante RESET del timer
stopwatch_start_commandOverride pulsante START del cronometro
stopwatch_reset_commandOverride pulsante RESET del cronometro
timer_base_h / timer_base_m / timer_base_sValori iniziali degli spinner h/m/s del timer

Metodo Edit() — principali parametri

ParametroDescrizione
titleTitolo finestra
nav_bg_color, nav_button_bg_colorBarra di navigazione tra i pannelli
nav_clock_text / nav_timer_text / nav_stopwatch_textEtichette pulsanti navigazione
nav_clock_fg_color / nav_timer_fg_color / nav_stopwatch_fg_colorColori testo dei pulsanti navigazione
clock_bg_color, clock_time_fg_color, clock_date_fg_colorColori pannello orologio
clock_time_text / clock_date_textTesti iniziali (sostituiti in runtime dalla logica interna)
timer_bg_color, timer_display_fg_colorColori pannello timer
timer_spin_h/m/s_bg/fg_colorColori spinner ore/minuti/secondi
timer_lbl_h/m/s_textEtichette "h", "m", "s"
timer_btn_start_text / timer_btn_pause_text / timer_btn_reset_textEtichette pulsanti timer
stopwatch_bg_color, stopwatch_display_fg_colorColori pannello cronometro
stopwatch_btn_start_text / stopwatch_btn_stop_text / stopwatch_btn_reset_textEtichette pulsanti cronometro

Metodi di navigazione & getter AGGIORNATO

ShowClock()
Porta la vista sul pannello Orologio.
ShowTimer()
Porta la vista sul pannello Timer.
ShowStopwatch()
Porta la vista sul pannello Cronometro.
GetTime() → str
Restituisce l'ora di sistema come "HH:MM:SS".
GetDate() → str
Restituisce la data di sistema come stringa formattata maiuscola (es. "THURSDAY, MAY 21, 2026").
GetElapsed() → str
Restituisce il tempo trascorso nel cronometro come "MM:SS.d".

📘 Esempio

from FlashGui import CLOCK

clock = CLOCK(title="⏱ Orologio", style="dark")
clock.Edit(
    nav_clock_text="ORA",
    nav_timer_text="TIMER",
    nav_stopwatch_text="CRONO",
    timer_btn_start_text="Avvia", timer_btn_pause_text="Pausa", timer_btn_reset_text="Reset"
)
clock.Logic(timer_base_m=5)  # timer parte da 5 minuti
clock.run()
📅
CALENDAR
Calendario interattivo con navigazione mese, selezione giorno, footer con data selezionata e testo info personalizzabile. Completamente internazionalizzabile.
from FlashGui import CALENDAR

cal = CALENDAR(title="Calendario", size=(2,2), style="light")
cal.run()

Metodo Logic()

ParametroDescrizione
prev_commandOverride freccia ← mese precedente. Se restituisce una stringa viene mostrata nel footer info.
next_commandOverride freccia → mese successivo
today_commandOverride pulsante TODAY; riceve date.today()
day_commandCallback click su un giorno; riceve un oggetto datetime.date
month_change_commandCallback cambio mese; riceve (year, month)
week_start_mondaybool — se la settimana parte da lunedì
show_footerbool — mostra/nasconde il footer

Metodo Edit() — principali parametri

ParametroDescrizione
title, frame_bg_color, bg_colorTitolo finestra, colori frame e pannello
title_fg_colorColore del mese/anno nel titolo
nav_bg_color, nav_button_bg_color, nav_button_fg_colorColori barra navigazione
prev_text / today_text / next_textEtichette pulsanti navigazione (default: "‹", "TODAY", "›")
prev/today/next_button_bg/fg_colorColori individuali per ciascun pulsante nav
weekday_bg/fg_colorColori intestazioni giorni settimana
day_bg/fg_colorColori giorni normali
day_today_bg/fg_colorColori del giorno odierno
day_selected_bg/fg_colorColori del giorno selezionato
day_disabled_bg/fg_colorColori celle vuote (giorni fuori mese)
footer_bg/fg_colorColori footer
info_textTesto libero mostrato nel footer
january_text … december_textNomi dei mesi (per internazionalizzazione)
monday_text … sunday_textIntestazioni colonne giorni (MON, TUE, …)
week_start_mondayRidisegna il calendario con settimana da lunedì o domenica
show_footerMostra/nasconde il footer

Metodi helper AGGIORNATO

get_selected_date() → datetime.date
Restituisce la data attualmente selezionata.
go_to_date(d: datetime.date)
Seleziona la data d e naviga il calendario al mese corrispondente.
NextMonth()
Naviga al mese successivo.
PrevMonth()
Naviga al mese precedente.
GoToToday()
Seleziona oggi e naviga al mese corrente.
set_info_text(text)
Imposta il testo libero del footer a runtime.

📘 Esempio

from FlashGui import CALENDAR
from datetime import date

cal = CALENDAR(title="Agenda", style="dark")
cal.Edit(
    january_text="Gennaio", february_text="Febbraio",
    monday_text="Lun", tuesday_text="Mar",
    wednesday_text="Mer", thursday_text="Gio",
    friday_text="Ven", saturday_text="Sab", sunday_text="Dom",
    today_text="OGGI", week_start_monday=True
)

def giorno_cliccato(d):
    cal.set_info_text(f"Selezionato: {d.strftime('%d/%m/%Y')}")

cal.Logic(day_command=giorno_cliccato)
cal.run()
🔍
SEARCHER NEW in 0.1.6
Ricerca file e cartelle in modo ricorsivo o flat, con filtri per tipo, query sul nome e stato in tempo reale. Thread-safe, annullabile in qualsiasi momento.
from FlashGui import SEARCHER

searcher = SEARCHER(title="Ricerca File", size=(3,2), style="light")
searcher.run()

Funzionamento di default

Cliccando Search viene avviato un thread in background che scansiona la directory indicata (o tutte le unità disco su Windows se vuota). I risultati appaiono in una ListCtrl con colonne Name, Type, Folder, Size, Modified. Il pulsante Stop interrompe la ricerca in modo sicuro. Clear svuota i risultati. Browse apre un dialog per scegliere la directory.

Metodo Logic()

ParametroDescrizione
search_commandCallback aggiuntivo all'avvio della ricerca (la ricerca avviene comunque)
cancel_commandCallback aggiuntivo alla pressione di Stop
clear_commandSostituisce il comportamento Clear se fornito
browse_commandCallback aggiuntivo alla pressione di Browse
open_commandSostituisce doppio-click su un risultato (riceve path: str). Default: os.startfile(path)
select_result_commandCallback selezione risultato; riceve (path, name, type)
finish_commandChiamata al termine della ricerca; riceve count: int
error_commandChiamata in caso di errore; riceve (message, traceback)

Metodo Edit()

ParametroDefaultDescrizione
title_text"File & Folder Search"Titolo grande in cima alla finestra
path_label_text"Search in"Etichetta campo percorso
query_label_text"Name contains"Etichetta campo query
type_label_text"Type"Etichetta dropdown tipo
recursive_label_text"Recursive search"Etichetta checkbox ricorsiva
btn_search_text / btn_cancel_text / btn_clear_text / btn_browse_textEtichette pulsanti
status_text"Ready"Testo iniziale status bar
panel_bg / panel_fgColori sfondo/testo pannello principale
title_bg / title_fgColori etichetta titolo
search_btn_bg / search_btn_fgColori pulsante Search (accent)
results_bg / results_fgColori lista risultati
status_bg / status_fgColori barra di stato
Tutti gli altri widget supportano parametri _bg / _fg analoghi.

Metodi di controllo programmatico

SetSearchPath(path="")
Imposta il campo percorso di ricerca.
GetSearchPath() → str
Restituisce il percorso corrente.
SetQuery(query="")
Imposta la query di ricerca (filtro nome).
GetQuery() → str
Restituisce la query corrente.
SetSearchType(value="Both")
Imposta il tipo di ricerca: "Files", "Folders" o "Both".
GetSearchType() → str
Restituisce il tipo di ricerca selezionato.
SetRecursive(value=True)
Attiva/disattiva la ricerca ricorsiva.
GetRecursive() → bool
Restituisce lo stato del checkbox ricorsivo.
SetStatus(text="")
Imposta il testo della status bar.
SetTitleText(text)
Cambia il titolo grande in cima.
ClearResults()
Svuota la lista risultati e resetta i contatori.
GetResultCount() → int
Numero di risultati attualmente nella lista.
GetResultPath(index) → str|None
Percorso completo del risultato all'indice specificato (0-based).
GetAllResultPaths() → list[str]
Lista di tutti i percorsi completi dei risultati.

📘 Esempio

from FlashGui import SEARCHER

s = SEARCHER(title="Cerca file Python", style="dark")
s.Edit(title_text="🔍 Ricerca File", btn_search_text="Cerca", btn_cancel_text="Stop")
s.SetSearchPath("C:/Users/me/Documents")
s.SetQuery(".py")
s.SetSearchType("Files")
s.SetRecursive(True)

def on_finish(count):
    s.SetStatus(f"Trovati {count} file Python!")

def on_open(path):
    import subprocess
    subprocess.Popen(["code", path])  # apri in VS Code

s.Logic(finish_command=on_finish, open_command=on_open)
s.run()
🪟
WINDOW
Tela bianca proporzionale: aggiungi qualsiasi widget con coordinate relative 0.0→1.0. Font, layout e resize sono automatici.
from FlashGui import WINDOW

win = WINDOW(
    title="La mia app",
    size=(800, 600),      # pixel assoluti (largh, alt)
    style="light",         # "light" o "dark"
    color=(240, 240, 240),
    icon=None,
    maximized=False,
    min_size=(400, 300),  # pixel o float 0→1
    max_size=(1920, 1080)
)
Tutte le coordinate relx, rely sono il centro del widget (0.0 = bordo sinistro/superiore, 1.0 = bordo destro/inferiore). relw, relh sono larghezza e altezza proporzionali al pannello.

Widgets disponibili AGGIORNATO

MetodoTipoPrincipali parametri specifici
add_label()StaticTexttext, align ("left"|"center"|"right"), fg, bg
add_entry()TextCtrl (1 riga)value, placeholder, read_only, on_change
add_textbox()TextCtrl (multilinea)value, read_only, on_change
add_button()Buttontext, on_click, fg, bg
add_checkbox()CheckBoxtext, value (bool), on_change
add_radio()RadioButtontext, value (bool), on_change
add_slider()Slidervalue, min_value, max_value, on_change
add_gauge()Gaugevalue, range
add_choice()Choice (dropdown)items, selection, on_change
add_listbox()ListBoxitems, selection, on_change
add_listctrl()ListCtrl (report)columns, rows, on_select
add_combobox()ComboBoxitems, value, on_change NEW
add_spinctrl()SpinCtrlvalue, min_value, max_value, on_change NEW
add_color_button()ColourPickerCtrltext, value (RGB), on_change
add_canvas()FGCanvasbg, pen, width, mode ("free"|"line"|"rect"|"circle"|"erase")
add_statusbar()FGStatusBarbg_color, text_color, sep_color, proportions
add_separator()StaticLineorientation ("horizontal"|"vertical") NEW
add_image()StaticBitmapimage_path NEW
add_menu()CustomMenuBarmenus (list of (label, CustomMenu)), bg_color, text_color, hover_color, radius NEW

Tutti i metodi add_* accettano i parametri comuni: relx, rely, relw, relh, fg, bg, font_scale, bold, tooltip, visible (dove applicabile). Restituiscono un FGProxy che puoi passare a Modify().

Metodo Modify(widget, **kwargs)

Aggiorna uno o più attributi di un widget già creato senza doverlo ricreare. Accetta widget= (il proxy restituito da add_*) oppure index= (posizione 0-based nella lista widget).

# Creo un label e poi lo modifico
lbl = win.add_label(text="Hello", relx=0.5, rely=0.3)
win.Modify(lbl, text="World", fg=(255,0,0), bold=True)

# Oppure tramite FGProxy
lbl.Modify(text="Ciao!", fg=(0,200,0))
I proxy FGProxy hanno anche scorciatoie: .SetText(), .GetText(), .SetValue(), .SetLabel(), .Show()/.Hide(), .Enable()/.Disable(), .Focus(), .clear(), .get_selection(), .get_selection_text(), .add_row(dati) (per listctrl).

Metodi di testo e file

GetText(widget=None, index=None) → str
Legge il testo del widget specificato (o del main_textbox/main_entry se nessuno è specificato).
SetText(text, widget=None, index=None) → bool
Imposta il testo del widget specificato.
ClearText(widget=None, index=None)
Svuota il testo del widget specificato.

Dialogs e helper file AGGIORNATO

ShowMessageBox(text, title="Message", style=wx.OK|wx.ICON_INFORMATION)
Mostra una finestra di dialogo standard.
ShowInputDialog(message, title="Input", default="") → str|None
Mostra un dialog di inserimento testo. Restituisce il testo inserito o None se annullato.
ShowYesNoDialog(message, title="Confirm") → bool
Mostra un dialog Sì/No. Restituisce True se l'utente clicca Sì.
OpenFileDialog(title, file_type, parent=None) → dict|None
Apre un dialog di selezione file. Restituisce {"path", "filename", "content", "encoding"} o None se annullato.
SaveFileDialog(title, file_type, default_name="", parent=None) → dict|None
Apre un dialog di salvataggio file. Restituisce {"path", "filename"} o None.
OpenFolderDialog(title="Select Folder") → str|None
Apre un dialog per scegliere una cartella. Restituisce il percorso o None.
LoadTextFromFile(path) → (content, encoding)
Carica un file di testo con auto-rilevamento encoding. Aggiorna main_textbox e current_file.
SaveTextToFile(path, text=None, encoding=None) → bool
Salva testo su file. Se text=None usa GetText(). Gestisce automaticamente fallback a UTF-8.

FGCanvas — canvas di disegno integrato

Il canvas supporta cinque modalità: "free" (disegno libero), "line", "rect", "circle", "erase". L'anteprima della forma viene disegnata durante il drag. Supporta tasto sinistro e destro del mouse.

canvas.Modify(bg_color=…, pen_color=…, pen_width=…, mode=…, clear=True, snapshot=…)
Modifica stile o stato del canvas via proxy FGProxy.Modify().
canvas.widget.ClearCanvas()
Cancella il contenuto del canvas.
canvas.widget.GetCanvasSnapshot() → list
Restituisce una copia profonda delle forme disegnate (serializzabile).
canvas.widget.SetCanvasSnapshot(shapes)
Ripristina il canvas da un snapshot precedente.

FGStatusBar — barra di stato personalizzabile

ParametroDescrizione
bg_color, text_color, sep_colorColori della barra e dei separatori
proportionsLista di interi proporzionali (negativi = proporzione relativa). Default: [-2,-1,-1,-1]
font_scaleScala del font rispetto alla dimensione del pannello. Default: 0.018

Via Modify(): status0…status3 per impostare i 4 slot testuali, oppure status_texts=[...] come lista.

BindKey — scorciatoie da tastiera NEW

# Collega Ctrl+S a una funzione
win.BindKey("Ctrl+S", salva_file)
win.BindKey("F5", esegui)
win.BindKey("Ctrl+Shift+Z", redo)
win.BindKey("Escape", chiudi_dialog)

Tasti speciali supportati: F1–F12, Escape, Enter, Delete, Backspace, Tab, Home, End, PageUp, PageDown, Up/Down/Left/Right, Space e tutti i caratteri ASCII.

Gestione finestra NEW

SetTitle(title)
Cambia il titolo della finestra a runtime.
GetTitle() → str
Restituisce il titolo attuale.
Center()
Centra la finestra sullo schermo.
Minimize()
Minimizza (iconizza) la finestra.
Maximize()
Massimizza la finestra.
Restore()
Ripristina la finestra da massimizzata o minimizzata.
SetOpacity(value)
Trasparenza finestra. value: 0.0 (invisibile) → 1.0 (opaco).
SetIcon(icon_path)
Cambia l'icona della finestra a runtime.
SetCloseHandler(handler)
Registra una funzione chiamata alla chiusura. Se restituisce False la chiusura viene annullata (utile per "vuoi salvare?").
exit()
Chiude la finestra programmaticamente.

📘 Esempi WINDOW

from FlashGui import WINDOW

win = WINDOW(title="Calcolatrice custom", size=(500, 400))

display = win.add_entry(value="", relx=0.5, rely=0.12, relw=0.9, relh=0.12, read_only=True)

for i, (lbl, rx, ry) in enumerate([
    ("7", 0.2, 0.35), ("8", 0.4, 0.35), ("9", 0.6, 0.35),
    ("4", 0.2, 0.50), ("5", 0.4, 0.50), ("6", 0.6, 0.50),
]):
    win.add_button(text=lbl, relx=rx, rely=ry, relw=0.18, relh=0.12,
                   on_click=lambda l=lbl: display.SetText(display.GetText()+l))

win.run()
# Esempio con canvas + statusbar + BindKey
from FlashGui import WINDOW

win = WINDOW(title="Paint mini", size=(800, 600), style="dark")

cvs = win.add_canvas(bg=(30,30,30), pen=(255,255,255), width=3, mode="free",
                     relx=0.5, rely=0.48, relw=0.98, relh=0.9)
sb  = win.add_statusbar(proportions=[-1, -1], relx=0.5, rely=1.0, relw=1.0, relh=0.05)

sb.Modify(status0="Modalità: free", status1="Ctrl+L = linea | Ctrl+R = rettangolo")

win.BindKey("Ctrl+L", lambda: cvs.Modify(mode="line"))
win.BindKey("Ctrl+R", lambda: cvs.Modify(mode="rect"))
win.BindKey("Ctrl+Delete", lambda: cvs.Modify(clear=True))

win.run()

API Comuni a tutti i moduli AGGIORNATO

Le API seguenti sono disponibili su tutti i moduli: CALCULATOR, NOTEPAD, PAINT, CLOCK, CALENDAR, SEARCHER, WINDOW.

Timer

AddTimer(delay_ms, func, name=None) → wx.Timer
Avvia un timer one-shot: chiama func() una sola volta dopo delay_ms millisecondi. Se fornito, name permette di identificare il timer per cancellarlo con DelTimer. Restituisce il timer.
AddRepeatTimer(interval_ms, func, name=None) → wx.Timer
Avvia un timer ripetitivo: chiama func() ogni interval_ms millisecondi finché non viene fermato con DelTimer.
DelTimer(timer_or_name)
Ferma e rimuove un timer. Accetta il nome stringa (se fornito in fase di creazione) oppure il riferimento all'oggetto timer.
# Esempio: aggiorno un label ogni secondo
import time
lbl = win.add_label(relx=0.5, rely=0.5)

win.AddRepeatTimer(1000, lambda: lbl.SetText(time.strftime("%H:%M:%S")), name="clock")

# Per fermarlo dopo 10 secondi:
win.AddTimer(10000, lambda: win.DelTimer("clock"))

Clipboard

CopyToClipboard(text)
Copia text negli appunti di sistema. In CALCULATOR e NOTEPAD il parametro è opzionale: se omesso copia il valore del display / la selezione.
GetClipboardText() → str
Restituisce il testo attualmente negli appunti di sistema. Restituisce stringa vuota se non è disponibile testo.

HTTP asincrono

Ogni modulo include un metodo per inviare richieste HTTP in un thread di background, senza bloccare la UI.

SendRequest(url, method="GET", data=None, headers=None, callback=None, use_json=False)
Invia una richiesta HTTP in background.
method: "GET", "POST", "PUT", "DELETE", ecc.
data: dizionario dei dati da inviare nel body.
headers: dizionario di header aggiuntivi.
use_json: se True, serializza data come JSON e imposta Content-Type: application/json.
callback(response_text, error_or_None): funzione chiamata sul thread principale al completamento.
# Esempio: chiamata API REST da WINDOW
def on_response(resp, err):
    if err:
        win.ShowMessageBox(f"Errore: {err}")
    else:
        lbl.SetText(resp)

win.SendRequest(
    url="https://api.example.com/data",
    method="POST",
    data={"key": "valore"},
    use_json=True,
    callback=on_response
)

Filosofia: Logic() vs Edit()

Edit() gestisce l'aspetto visivo: colori, testi, etichette.
Logic() gestisce il comportamento: quali funzioni vengono chiamate agli eventi.

Questa separazione netta permette di:

  • Tradurre completamente l'interfaccia chiamando solo Edit() con le stringhe localizzate.
  • Iniettare la logica applicativa senza toccare la UI, mantenendo il codice pulito.
  • Ridefinire solo i comportamenti che interessano: se non passi un parametro a Logic(), il comportamento default rimane attivo.