FlashGui 0.1.5

Costruisci interfacce desktop con il sorriso. Componenti già pronti, layout proporzionale, temi personalizzabili.

✨ Perché FlashGui?

Hai presente quando vuoi creare una piccola app desktop in Python e ti scontri con la complessità di Tkinter o la verbosità di wxPython? FlashGui nasce per darti calcolatrice, blocco note, paint, orologio e calendario già funzionanti in 3 righe di codice. Se vuoi costruire la tua interfaccia da zero, il componente WINDOW ti permette di posizionare qualsiasi widget usando coordinate proporzionali (0.0 → 1.0) e i font si ridimensionano da soli. Tutto con un look pulito, moderno e completamente personalizzabile.

💡 Idea: FlashGui è perfetto per prototipi rapidi, tool interni, o per chi si avvicina alla programmazione GUI e vuole risultati immediati senza studiare mille manuali.

📦 Installazione in un soffio

pip install FlashGui

wxPython e charset_normalizer verranno installati automaticamente. Nessun'altra dipendenza.

✅ Funziona su: Windows 10/11, macOS (Intel/Apple Silicon), Linux con wxPython supportato. Richiede Python 3.7 o superiore.

📚 Dipendenze

FlashGui è costruito sopra wxPython Phoenix (wxWidgets) e utilizza charset_normalizer per il rilevamento automatico delle codifiche nel blocco note. Entrambe le librerie vengono installate automaticamente con pip.

📜 Licenze – Leggi con attenzione

⚠️ Obbligo di attribuzione: Se distribuisci un'applicazione che include FlashGui (anche in forma compilata), devi includere i testi di licenza delle seguenti librerie:
  • La Licenza MIT di FlashGui (testo sotto).
  • La wxWindows Library Licence di wxPython (LGPL con eccezione).
  • La Licenza MIT di charset_normalizer.
Non costa nulla e mantiene il progetto libero.
📂 Dove trovo le licenze?
Per evitare confusione, non abbiamo pubblicato testi parziali qui sul sito. Trovi tutti i file legali completi direttamente dentro la cartella della libreria, nel percorso:
FlashGUI/licenses/

🧮 CALCULATOR – La calcolatrice che puoi vestire a modo tuo

Una calcolatrice completa con display, 20 pulsanti e gestione degli errori. Puoi cambiarne ogni singolo aspetto e agganciare le tue funzioni a ogni tasto.

Costruttore

CALCULATOR(title="Calculator", size=(3,2), color=(240,240,240), icon=None, maximized=False, min_size=(5,4), max_size=(1,1), style="light")
ParametroTipoDefaultDescrizione
titlestr"Calculator"Titolo della finestra.
sizetuple (larghezza, altezza)(3,2)Dimensioni relative allo schermo. Il valore indica in quante parti dividere lo schermo. Es. (3,2) → larghezza = schermo/3, altezza = schermo/2.
colortuple (R,G,B)(240,240,240)Colore di sfondo della finestra.
iconstrNonePercorso a un file .png o .ico per l'icona della finestra.
maximizedboolFalseSe True, la finestra parte massimizzata.
min_sizetuple (larghezza, altezza)(5,4)Dimensioni minime (divisore dello schermo).
max_sizetuple (larghezza, altezza)(1,1)Dimensioni massime (divisore dello schermo). (1,1) = schermo intero.
stylestr"light"Tema: "light" o "dark".

Metodo .Edit() – Personalizzazione completa

Modifica testi, colori e aspetto di ogni elemento. Tutti i parametri sono opzionali.

ParametroTipoDefaultDescrizione
button_0_textbutton_9_textstr"0"…"9"Etichetta dei pulsanti numerici.
button_0_bgbutton_9_bgtuple RGB(240,240,240)Colore di sfondo dei pulsanti numerici.
button_0_fgbutton_9_fgtuple RGB(0,0,0)Colore del testo dei pulsanti numerici.
button_dot_textstr"."Etichetta pulsante punto decimale.
button_dot_bg, button_dot_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante punto.
button_plus_textstr"+"Etichetta addizione.
button_plus_bg, button_plus_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante +.
button_minus_textstr"-"Etichetta sottrazione.
button_minus_bg, button_minus_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante -.
button_mul_textstr"*"Etichetta moltiplicazione.
button_mul_bg, button_mul_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante *.
button_div_textstr"/"Etichetta divisione.
button_div_bg, button_div_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante /.
button_C_textstr"C"Etichetta pulsante Clear.
button_C_bg, button_C_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante C.
button_DEL_textstr"DEL"Etichetta pulsante Canc.
button_DEL_bg, button_DEL_fgtuple RGB(240,240,240), (0,0,0)Colori pulsante DEL.
button_eq_textstr"="Etichetta pulsante Uguale.
button_eq_bgtuple RGB(0,120,215)Sfondo del tasto = (blu di default).
button_eq_fgtuple RGB(255,255,255)Colore testo tasto =.
entry_bg_colortuple RGB(240,240,240)Sfondo del display.
entry_text_colortuple RGB(0,0,0)Colore testo display.
message_errorstr"Error"Messaggio mostrato in caso di errore di valutazione.

Metodo .Logic() – Callback personalizzati

Ogni parametro accetta una funzione senza argomenti (o None per comportamento predefinito).

ParametroDescrizione
button_0_commandbutton_9_commandFunzione chiamata alla pressione del tasto numerico.
button_dot_commandCallback per il tasto punto.
button_plus_commandCallback per +.
button_minus_commandCallback per -.
button_mul_commandCallback per *.
button_div_commandCallback per /.
button_eq_commandCallback per = (sostituisce eval).
button_C_commandCallback per Clear.
button_DEL_commandCallback per Delete.

Metodi pubblici aggiuntivi

📘 Esempio CALCULATOR

calculator_demo.py
from FlashGui import CALCULATOR

def mio_callback():
    print("Hai premuto un tasto personalizzato!")

calc = CALCULATOR(title="La mia calcolatrice", size=(3,2), color=(50,50,60), style="dark")
calc.Edit(
    button_eq_bg=(200,50,50),
    button_eq_fg=(255,255,255),
    entry_bg_color=(30,30,40),
    entry_text_color=(0,200,0),
    message_error="ERRORE"
)
calc.Logic(button_0_command=mio_callback)
calc.run()

📝 NOTEPAD – Un editor di testo con i fiocchi

Blocco note completo: apertura/salvataggio con rilevamento automatico della codifica (charset_normalizer), menu personalizzabili, barra di stato, menu contestuale e temi scuri.

Costruttore

Stessi parametri di CALCULATOR (title, size, color, icon, maximized, min_size, max_size, style).

Metodo .Edit() – Personalizzazione totale

Oltre 50 parametri per personalizzare ogni testo, colore e comportamento.

ParametroTipoDefaultDescrizione
file_menu_textstr"File"Etichetta menu File.
edit_menu_textstr"Edit"Etichetta menu Modifica.
help_menu_textstr"Help"Etichetta menu Aiuto.
new_text, open_text, save_text, saveas_text, exit_textstr"New", "Open...", "Save", "Save As...", "Exit"Testi voci menu File.
undo_text, redo_text, cut_text, copy_text, paste_text, selectall_textstr"Undo","Redo","Cut","Copy","Paste","Select All"Testi voci menu Edit.
about_textstr"About"Testo voce About.
bg_color, text_ctrl_bg, text_ctrl_fgtuple RGB(240,240,240), (255,255,255), (0,0,0)Colori sfondo finestra, area testo e testo.
menubar_bg, menubar_fg, menubar_hovertuple RGB(235,235,235), (0,0,0), (200,220,240)Colori barra menu.
menu_bg, menu_fg, menu_hover, menu_radiustuple RGB / int(250,250,250), (0,0,0), (200,220,240), 6Colori menu a tendina e raggio bordi.
statusbar_bg, statusbar_fg, statusbar_separator_colortuple RGB(240,240,240), (0,0,0), (200,200,200)Colori barra di stato.
ln_text, col_text, words_text, chars_text, untitled_textstr"Ln","Col","Words","Chars","Untitled"Etichette barra di stato.
open_dialog_title, open_dialog_file_typestr, tuple"Open Text file", ("Text Files (*.txt)", "All files (*.*)")Titolo e filtro finestra Apri.
save_as_dialog_title, save_as_dialog_file_typestr, tuple"Save Text file", ("Text Files (*.txt)", "All files (*.*)")Titolo e filtro Salva con nome.
maybe_save_dialog_title, maybe_save_dialog_textstr"Save changes", "There are unsaved changes..."Titolo e testo dialogo salvataggio modifiche.
messagebox_about_title, messagebox_about_textstr"About Notepad", "Notepad created with FastGui.\nVersion 1.0"Titolo e testo finestra About.
popup_cut_text, popup_copy_text, popup_paste_text, popup_select_all_textstr"Cut","Copy","Paste","Select All"Testi menu contestuale.

Metodo .Logic() – Sostituisci le azioni predefinite

ParametroDescrizione
menu_new_command, menu_open_command, menu_save_command, menu_save_as_command, menu_exit_commandCallback per le voci del menu File.
menu_undo_command, menu_redo_command, menu_cut_command, menu_copy_command, menu_paste_command, menu_select_all_commandCallback per le voci del menu Edit.
menu_about_commandCallback per About.
popup_cut_command, popup_copy_command, popup_paste_command, popup_select_all_commandCallback per menu contestuale.

📘 Esempio NOTEPAD

notepad_demo.py
from FlashGui import NOTEPAD

def salva_personalizzato():
    print("Salvataggio personalizzato!")

nota = NOTEPAD(title="Mio Blocco Note", size=(2,2), style="dark")
nota.Edit(
    file_menu_text="Archivio",
    edit_menu_text="Modifica",
    text_ctrl_bg=(40,40,50),
    text_ctrl_fg=(200,200,100),
    menubar_bg=(60,60,70),
    menubar_fg=(255,255,255)
)
nota.Logic(menu_save_command=salva_personalizzato)
nota.run()

🎨 PAINT – Disegna come su una tela vera

Pennello, gomma, secchiello (riempimento), linea, cerchio, rettangolo. Salva in PNG o JPG.

Costruttore

Stessi parametri standard, incluso style.

Metodo .Edit()

ParametroTipoDefaultDescrizione
brush_button_text, eraser_button_text, bucket_button_text, line_button_text, circle_button_text, rect_button_textstr"🖌️ Brush","🧽 Eraser","🪣 Bucket","📏 Line","⭕ Circle","⬜ Rectangle"Testi pulsanti strumenti.
brush_button_bg, brush_button_fgtuple RGB(255,255,255), (0,0,0)Colori sfondo e testo per il pulsante Pennello.
eraser_button_bg, eraser_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Gomma.
bucket_button_bg, bucket_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Secchiello.
line_button_bg, line_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Linea.
circle_button_bg, circle_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Cerchio.
rect_button_bg, rect_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Rettangolo.
clear_button_text, save_button_textstr"🧹 Clear","💾 Save"Testi pulsanti Clear e Save.
clear_button_bg, clear_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Clear.
save_button_bg, save_button_fgtuple RGB(255,255,255), (0,0,0)Colori per Save.
toolbar_panel_bgtuple RGB(240,240,245)Sfondo barra strumenti.
canvas_bgtuple RGB(255,255,255)Sfondo area disegno.
width_textstr"Width"Testo etichetta spessore.
title_save_imagestr"Save Image"Titolo finestra di salvataggio.
text_file_png, text_file_jpgstr"PNG files", "JPG files"Descrizione tipi file nel dialog.

Metodo .Logic()

ParametroTipoDefaultDescrizione
current_toolstr"brush"Strumento iniziale: "brush", "eraser", "line", "circle", "rect", "bucket".
color_picker_start_colortuple RGB(0,0,0)Colore iniziale del selettore.
slider_start_valueint5Spessore iniziale.
slider_from_value, slider_to_valueint0, 100Minimo e massimo slider.
brush_button_command, eraser_button_command, line_button_command, circle_button_command, rect_button_command, bucket_button_commandcallableNoneCallback per i pulsanti strumento.
clear_button_command, save_button_commandcallableNoneCallback per Clear e Save.

📘 Esempio PAINT

paint_demo.py
from FlashGui import PAINT

paint = PAINT(title="Mio Paint", size=(2,2), style="light")
paint.Edit(
    brush_button_text="Pennello",
    eraser_button_text="Gomma",
    canvas_bg=(200,230,200),
    width_text="Spessore"
)
paint.Logic(current_tool="brush", slider_start_value=10)
paint.run()

⏰ CLOCK – Orologio, Timer e Cronometro in un'unica finestra

Costruttore

Parametri standard + style.

Metodo .Edit() – Parametri completi

La tabella seguente elenca tutti i parametri modificabili.

CategoriaParametroTipoDefault
Navigazionenav_bg_colortuple RGB#F5F5F7 (light) / #242424 (dark)
nav_button_bg_colortuple RGB#F5F5F7 / #242424
nav_clock_fg_color, nav_timer_fg_color, nav_stopwatch_fg_colortuple RGB#007AFF / cyan (dark)
nav_clock_text, nav_timer_text, nav_stopwatch_textstr"CLOCK", "TIMER", "STOPWATCH"
Orologioclock_bg_colortuple RGB#FFFFFF / #1E1E1E
clock_time_bg_color, clock_time_fg_colortuple RGBbg_color, #1D1D1F / #FFFFFF
clock_date_bg_color, clock_date_fg_colortuple RGBbg_color, #007AFF / #4DA3FF
clock_time_text, clock_date_textstr"00:00:00", "DATE"
Timertimer_bg_colortuple RGB#FFFFFF / #1E1E1E
timer_display_bg_color, timer_display_fg_colortuple RGBbg_color, #007AFF / white
timer_spin_h_bg_color, timer_spin_h_fg_color (e per m, s)tuple RGB#FFFFFF / #1D1D1F (light), #2A2A2A / #FFFFFF (dark)
timer_lbl_h_bg_color, timer_lbl_h_fg_color (e per m, s)tuple RGBbg_color, #8E8E93 / #A0A0A0
timer_btn_start_bg_color, timer_btn_start_fg_colortuple RGBNone / #1D1D1F (light), #2A2A2A / #FFFFFF (dark)
timer_btn_reset_bg_color, timer_btn_reset_fg_colortuple RGBcome start
timer_display_textstr"00:00:00"
timer_lbl_h_text, timer_lbl_m_text, timer_lbl_s_textstr"h", "m", "s"
timer_btn_start_text, timer_btn_pause_text, timer_btn_reset_textstr"START", "PAUSE", "RESET"
Cronometrostopwatch_bg_colortuple RGB#FFFFFF / #1E1E1E
stopwatch_display_bg_color, stopwatch_display_fg_colortuple RGBbg_color, #007AFF / white
stopwatch_btn_start_bg_color, stopwatch_btn_start_fg_colortuple RGBNone / #1D1D1F, #2A2A2A / #FFFFFF
stopwatch_btn_reset_bg_color, stopwatch_btn_reset_fg_colortuple RGBcome start
stopwatch_display_textstr"00:00.0"
stopwatch_btn_start_text, stopwatch_btn_stop_text, stopwatch_btn_reset_textstr"START", "STOP", "RESET"

Metodo .Logic()

ParametroDescrizione
nav_clock_command, nav_timer_command, nav_stopwatch_commandCallback per click schede.
timer_start_command, timer_reset_commandCallback avvio/reset timer.
stopwatch_start_command, stopwatch_reset_commandCallback avvio/reset cronometro.
timer_base_h, timer_base_m, timer_base_sValori iniziali timer (int).

📘 Esempio CLOCK

clock_demo.py
from FlashGui import CLOCK

clock = CLOCK(title="Orologio multifunzione", size=(2,2), style="dark")
clock.Edit(
    nav_clock_text="OROLOGIO",
    nav_timer_text="TIMER",
    nav_stopwatch_text="CRONOMETRO",
    clock_time_fg_color=(255,100,100),
    clock_date_fg_color=(100,200,255),
    timer_btn_start_text="AVVIA",
    timer_btn_reset_text="RESET"
)
clock.Logic(timer_base_h=0, timer_base_m=1, timer_base_s=30)
clock.run()

📅 CALENDAR – Un calendario interattivo e internazionalizzabile

Costruttore

Parametri standard + style.

Metodo .Edit() – Parametri completi

ParametroTipoDefaultDescrizione
bg_colortuple RGB#FFFFFF / #242424Sfondo principale.
title_fg_colortuple RGB#1D1D1F / #FFFFFFColore titolo mese.
nav_bg_colortuple RGB#F5F5F7 / #2A2A2ASfondo barra navigazione.
nav_button_bg_colortuple RGB#F5F5F7 / #2A2A2ASfondo pulsanti nav.
nav_button_fg_colortuple RGB#007AFF / #4DA3FFColore icone nav.
prev_text, today_text, next_textstr"‹", "TODAY", "›"Testi pulsanti.
prev_button_bg_color, prev_button_fg_color, today_button_bg_color, today_button_fg_color, next_button_bg_color, next_button_fg_colortuple RGBvedi sopraColori specifici per ogni pulsante nav.
weekday_bg_color, weekday_fg_colortuple RGB#FFFFFF / #1E1E1E, #8E8E93 / #A0A0A0Intestazioni giorni.
day_bg_color, day_fg_colortuple RGB#FFFFFF / #1E1E1E, #1D1D1F / #FFFFFFCelle giorni normali.
day_disabled_bg_color, day_disabled_fg_colortuple RGB#FFFFFF / #1E1E1E, #C7C7CC / #555555Giorni fuori mese.
day_today_bg_color, day_today_fg_colortuple RGB#007AFF / #4DA3FF, #FFFFFFGiorno corrente.
day_selected_bg_color, day_selected_fg_colortuple RGB#1D1D1F / #FFFFFF, #FFFFFF / #000000Giorno selezionato.
footer_bg_color, footer_fg_colortuple RGB#FFFFFF / #1E1E1E, #8E8E93 / #A0A0A0Colori footer.
info_textstr"Calendar created by FastGUI"Testo footer.
january_textdecember_textstr"JANUARY"…"DECEMBER"Nomi mesi.
monday_textsunday_textstr"MON"…"SUN"Nomi giorni abbreviati.
week_start_mondayboolTrueLa settimana inizia lunedì.
show_footerboolTrueMostra/nasconde footer.

Metodo .Logic()

ParametroDescrizione
prev_command, next_command, today_commandCallback per pulsanti navigazione.
day_command(date)Chiamato quando si seleziona un giorno (riceve datetime.date).
month_change_command(year, month)Callback al cambio mese.
week_start_monday, show_footerOverride delle impostazioni.

Metodi pubblici aggiuntivi

📘 Esempio CALENDAR

calendar_demo.py
from FlashGui import CALENDAR
from datetime import date

def giorno_selezionato(d):
    print(f"Hai scelto il {d}")

cal = CALENDAR(title="Calendario Eventi", size=(2,2), style="light")
cal.Edit(
    week_start_monday=False,
    monday_text="LUN",
    tuesday_text="MAR",
    info_text="Seleziona una data per l'evento",
    day_today_bg_color=(200,100,50)
)
cal.Logic(day_command=giorno_selezionato)
cal.go_to_date(date(2025, 12, 25))
cal.run()

🪟 WINDOW – La tua tela bianca proporzionale

Layout proporzionale automatico: coordinate relative (0.0‑1.0) e font scalati. Ogni metodo Add... restituisce un oggetto widget con un metodo .Modify() per cambiare proprietà a runtime.

Costruttore

Stessi parametri degli altri componenti (title, size, color, icon, maximized, min_size, max_size, style).

➕ Metodi per aggiungere widget

Tutti i metodi accettano i parametri comuni relx, rely, relwidth, relheight (float tra 0 e 1) e opzionalmente font_scale, tooltip, enabled, visible, cursor, parent. Di seguito i dettagli specifici per ciascun widget.

MetodoParametri specificiRitornaDescrizione
AddLabel(text, bold, fg, bg, font_scale, alignment, tooltip, enabled, visible, cursor, parent) alignment: "left", "center", "right" (default "left")
bold: bool
_WidgetHandle (wx.StaticText) Etichetta di testo.
AddButton(text, command, bold, fg, bg, font_scale, tooltip, enabled, visible, cursor, parent) command: funzione senza argomenti
bold: bool
_WidgetHandle (wx.Button) Pulsante.
AddInput(text, hint, password, readonly, fg, bg, font_scale, tooltip, enabled, visible, cursor, parent) hint: testo placeholder
password: bool (mostra •••)
readonly: bool
_WidgetHandle (wx.TextCtrl) Campo input riga singola.
AddTextArea(text, readonly, fg, bg, font_scale, tooltip, enabled, visible, cursor, parent) readonly: bool _WidgetHandle (wx.TextCtrl multilinea) Area di testo.
AddCounter(min_val, max_val, start, step, font_scale, tooltip, enabled, visible, cursor, parent) _WidgetHandle (wx.SpinCtrl) Contatore numerico.
AddCalendar(command, tooltip, enabled, visible, cursor, parent) command: riceve wx.DateTime _WidgetHandle (wx.adv.CalendarCtrl) Calendario.
AddSlider(min_val, max_val, start, command, orientation, tooltip, enabled, visible, cursor, parent) orientation: "horizontal" o "vertical"
command: riceve il valore corrente (int)
_WidgetHandle (wx.Slider) Slider.
AddColorPicker(color, command, tooltip, enabled, visible, cursor, parent) command: riceve colore esadecimale (str) _WidgetHandle (wx.ColourPickerCtrl) Selettore colore.
AddCheckBox(label, checked, command, font_scale, tooltip, enabled, visible, cursor, parent) command: riceve bool _WidgetHandle (wx.CheckBox) Checkbox.
AddRadioButton(label, checked, command, font_scale, tooltip, enabled, visible, cursor, parent, group_start) command: riceve bool
group_start: se True inizia un nuovo gruppo (default False, ma automaticamente gestito se non specificato)
_WidgetHandle (wx.RadioButton) Radio button.
AddComboBox(choices, value, command, font_scale, tooltip, enabled, visible, cursor, parent) command: riceve il valore selezionato (str) _WidgetHandle (wx.ComboBox) Menu a tendina editabile.
AddListBox(choices, command, multiple, font_scale, tooltip, enabled, visible, cursor, parent) multiple: bool (selezione multipla)
command: riceve il valore selezionato (str) o lista di valori se multipla
_WidgetHandle (wx.ListBox) Lista di selezione.
AddCanvas(bg, tooltip, enabled, visible, cursor, parent) bg: colore sfondo (default "white") _WidgetHandle (_CanvasPanel) Area di disegno.
AddTabs(tooltip, enabled, bg, visible, cursor, parent) bg: colore sfondo tabs _WidgetHandle (_CustomTabs) Contenitore a schede personalizzato.
AddPage(notebook, title, color, bg, active_fg, size_text) title: str, color: colore testo inattivo, bg: sfondo pagina, active_fg: colore testo attivo, size_text: fattore dimensione testo (default 1.0) _WidgetHandle (wx.Panel) Aggiunge una pagina a un notebook creato con AddTabs.

🛠️ Metodi di utilità e modifica

Barra menu e status bar

Timer e dialoghi

Manipolazione widget

Il metodo .Modify() dei widget

Ogni widget restituito dai metodi Add... possiede un metodo .Modify(**kwargs) che permette di cambiare proprietà dopo la creazione. I parametri variano in base al tipo di widget, ma includono sempre relx, rely, relwidth, relheight, font_scale, tooltip, enabled, visible, cursor, bg, fg.

Esempi per tipo:

# Label
label = win.AddLabel("Ciao", relx=0.3, rely=0.4)
label.Modify(text="Nuovo testo", fg=(255,0,0), font_scale=1.5)

# Button
btn = win.AddButton("Click")
btn.Modify(text="Premi", bg=(100,200,100), command=nuova_funzione)

# Input / TextArea
inp = win.AddInput()
inp.Modify(text="Valore", hint="Inserisci...", readonly=True)

# Counter
cnt = win.AddCounter(min_val=1, max_val=10)
cnt.Modify(value=5, step=2)

# CheckBox / RadioButton
cb = win.AddCheckBox("Opzione")
cb.Modify(checked=True, text="Abilitato")

# ComboBox / ListBox
cbx = win.AddComboBox(choices=["A","B"])
cbx.Modify(choices=["X","Y","Z"], value="Y")

# Canvas
canvas = win.AddCanvas(bg="white")
canvas.Modify(bg=(200,220,240))
win.CanvasSetPen(canvas, color="blue", width=3)
win.CanvasClear(canvas, bg="lightgray")

📘 Esempi WINDOW

window_basic.py
from FlashGui import WINDOW

win = WINDOW(title="Demo Base", size=(2,2))
win.AddLabel("Ciao Mondo!", relx=0.3, rely=0.4, relwidth=0.4, relheight=0.1)
win.AddButton("Click", command=lambda: win.Message("Ciao!"), relx=0.4, rely=0.6, relwidth=0.2, relheight=0.1)
win.run()
window_tabs.py
from FlashGui import WINDOW

win = WINDOW(title="Esempio Tabs", size=(2,2))
tabs = win.AddTabs(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.8)

pagina1 = win.AddPage(tabs, title="Home", bg="#FFFFFF")
win.AddLabel("Benvenuto nella prima scheda", parent=pagina1, relx=0.1, rely=0.4)

pagina2 = win.AddPage(tabs, title="Impostazioni", bg="#F0F0F0")
win.AddCheckBox("Opzione 1", parent=pagina2, relx=0.2, rely=0.2)

win.run()

🔁 La triade magica: run(), Edit(), Logic()

Ogni componente FlashGui espone questi tre metodi fondamentali:

⏱️ AddTimer() – comune a tutti i componenti

Tutti i componenti (CALCULATOR, NOTEPAD, PAINT, CLOCK, CALENDAR, WINDOW) possiedono il metodo AddTimer(ms, command) che avvia un timer periodico. Restituisce l'oggetto wx.Timer. In WINDOW è presente anche StopTimer(timer).

def aggiorna():
    print("Timer scattato")

calc = CALCULATOR()
calc.AddTimer(1000, aggiorna)   # ogni secondo
calc.run()
🧠 Ordine consigliato: Crea l'oggetto → .Edit(...).Logic(...).run().