FlashGui 0.1.6
App desktop Python in 3 righe. Componenti pronti, finestra personalizzabile, API uniforme.
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
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 moduli —
AddRepeatTimer,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:
| Parametro | Tipo | Default | Descrizione |
|---|---|---|---|
title | str | "…" | Titolo della finestra OS |
size | tuple(float,float) | (2,2) | Divisore della risoluzione schermo: screen_w/size[0] × screen_h/size[1] |
color | tuple(R,G,B) | (240,240,240) | Colore di sfondo della finestra. Ignorato se style="dark" |
icon | str|None | None | Percorso a icona .png o .ico |
maximized | bool | False | Avvia la finestra massimizzata |
min_size | tuple | (5,4) | Dimensione minima come divisore di schermo |
max_size | tuple | (1,1) | Dimensione massima. (1,1) = full screen |
style | str | "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.
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).
| Parametro | Tipo | Default | Attivato da |
|---|---|---|---|
button_0_command … button_9_command | callable|None | None | Pulsanti 0–9 |
button_dot_command | callable|None | None | Pulsante . |
button_plus_command | callable|None | None | + |
button_minus_command | callable|None | None | - |
button_mul_command | callable|None | None | * |
button_div_command | callable|None | None | / |
button_eq_command | callable|None | None | = (default: eval) |
button_C_command | callable|None | None | C (default: clear) |
button_DEL_command | callable|None | None | DEL (default: backspace) |
Metodo Edit()
Personalizza colori, testi e stile di tutti i pulsanti e del display.
| Parametro | Default | Descrizione |
|---|---|---|
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
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()
from FlashGui import NOTEPAD
nota = NOTEPAD(title="Mio Blocco Note", size=(2,2), style="dark")
nota.run()
Metodo Logic()
| Parametro | Descrizione |
|---|---|
menu_new_command | Override File → Nuovo (default: svuota editor) |
menu_open_command | Override File → Apri (default: dialog apertura file) |
menu_save_command | Override File → Salva |
menu_save_as_command | Override File → Salva come |
menu_exit_command | Override File → Esci |
menu_about_command | Override Aiuto → Informazioni |
menu_undo_command | Override Modifica → Annulla |
menu_redo_command | Override Modifica → Ripristina |
menu_cut_command | Override Modifica → Taglia |
menu_copy_command | Override Modifica → Copia |
menu_paste_command | Override Modifica → Incolla |
menu_select_all_command | Override Modifica → Seleziona tutto |
popup_cut/copy/paste/select_all_command | Override stesso comportamento nel menu contestuale (tasto destro) |
Metodo Edit() — principali parametri
| Parametro | Descrizione |
|---|---|
new_text, open_text, save_text, saveas_text, exit_text, about_text | Etichette voci di menu File/Help |
undo_text, redo_text, cut_text, copy_text, paste_text, selectall_text | Etichette voci menu Modifica |
file_menu_text, edit_menu_text, help_menu_text | Intestazioni menu bar |
bg_color, text_ctrl_bg, text_ctrl_fg | Colori area testo |
menubar_bg, menubar_fg, menubar_hover | Colori menu bar |
menu_bg, menu_fg, menu_hover, menu_radius | Colori popup menu a tendina |
statusbar_bg, statusbar_fg, statusbar_separator_color | Colori status bar |
open_dialog_title / open_dialog_file_type | Titolo e tipi file del dialog di apertura |
save_as_dialog_title / save_as_dialog_file_type | Titolo e tipi del dialog Salva come |
messagebox_about_title / messagebox_about_text | Finestra Informazioni |
maybe_save_dialog_title / maybe_save_dialog_text | Messaggio "vuoi salvare prima di uscire?" |
popup_cut_text, popup_copy_text, popup_paste_text, popup_select_all_text | Voci menu contestuale |
ln_text, col_text, words_text, chars_text | Etichette status bar (riga, colonna, parole, caratteri) |
untitled_text | Testo del titolo quando il file non ha nome |
Metodi testo AGGIORNATO
text.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()
from FlashGui import PAINT
paint = PAINT(title="Mio Paint", size=(2,2), style="light")
paint.run()
Metodo Logic()
| Parametro | Default | Descrizione |
|---|---|---|
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_value | 5 | Valore iniziale dello slider larghezza |
slider_from_value | 0 | Valore minimo slider |
slider_to_value | 100 | Valore massimo slider |
brush_button_command | None | Callback pulsante Brush |
eraser_button_command | None | Callback pulsante Eraser |
line_button_command | None | Callback pulsante Line |
circle_button_command | None | Callback pulsante Circle |
rect_button_command | None | Callback pulsante Rectangle |
bucket_button_command | None | Callback pulsante Bucket |
clear_button_command | None | Callback pulsante Clear |
save_button_command | None | Callback pulsante Save (sovrascrive il comportamento di default) |
Metodo Edit() — principali parametri
| Parametro | Descrizione |
|---|---|
brush/eraser/bucket/line/circle/rect_button_bg/fg | Colori sfondo/testo di ogni pulsante strumento |
clear_button_bg/fg, save_button_bg/fg | Colori pulsanti Clear e Save |
brush/eraser/…_button_text | Etichette dei pulsanti strumento |
clear_button_text, save_button_text | Etichette Clear/Save |
width_text | Etichetta dello slider larghezza (default "Width") |
canvas_bg | Colore sfondo canvas |
toolbar_panel_bg | Colore sfondo toolbar |
title_save_image | Titolo del dialog di salvataggio |
text_file_png, text_file_jpg | Descrizioni tipo file nel dialog di salvataggio |
Metodi canvas AGGIORNATO
True se il file esiste.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()
from FlashGui import CLOCK
clock = CLOCK(title="Orologio", size=(2,2), style="dark")
clock.run()
Metodo Logic()
| Parametro | Descrizione |
|---|---|
nav_clock_command | Override click tab CLOCK (default: mostra pannello orologio) |
nav_timer_command | Override click tab TIMER |
nav_stopwatch_command | Override click tab STOPWATCH |
timer_start_command | Override pulsante START del timer |
timer_reset_command | Override pulsante RESET del timer |
stopwatch_start_command | Override pulsante START del cronometro |
stopwatch_reset_command | Override pulsante RESET del cronometro |
timer_base_h / timer_base_m / timer_base_s | Valori iniziali degli spinner h/m/s del timer |
Metodo Edit() — principali parametri
| Parametro | Descrizione |
|---|---|
title | Titolo finestra |
nav_bg_color, nav_button_bg_color | Barra di navigazione tra i pannelli |
nav_clock_text / nav_timer_text / nav_stopwatch_text | Etichette pulsanti navigazione |
nav_clock_fg_color / nav_timer_fg_color / nav_stopwatch_fg_color | Colori testo dei pulsanti navigazione |
clock_bg_color, clock_time_fg_color, clock_date_fg_color | Colori pannello orologio |
clock_time_text / clock_date_text | Testi iniziali (sostituiti in runtime dalla logica interna) |
timer_bg_color, timer_display_fg_color | Colori pannello timer |
timer_spin_h/m/s_bg/fg_color | Colori spinner ore/minuti/secondi |
timer_lbl_h/m/s_text | Etichette "h", "m", "s" |
timer_btn_start_text / timer_btn_pause_text / timer_btn_reset_text | Etichette pulsanti timer |
stopwatch_bg_color, stopwatch_display_fg_color | Colori pannello cronometro |
stopwatch_btn_start_text / stopwatch_btn_stop_text / stopwatch_btn_reset_text | Etichette pulsanti cronometro |
Metodi di navigazione & getter AGGIORNATO
"HH:MM:SS"."THURSDAY, MAY 21, 2026")."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()
from FlashGui import CALENDAR
cal = CALENDAR(title="Calendario", size=(2,2), style="light")
cal.run()
Metodo Logic()
| Parametro | Descrizione |
|---|---|
prev_command | Override freccia ← mese precedente. Se restituisce una stringa viene mostrata nel footer info. |
next_command | Override freccia → mese successivo |
today_command | Override pulsante TODAY; riceve date.today() |
day_command | Callback click su un giorno; riceve un oggetto datetime.date |
month_change_command | Callback cambio mese; riceve (year, month) |
week_start_monday | bool — se la settimana parte da lunedì |
show_footer | bool — mostra/nasconde il footer |
Metodo Edit() — principali parametri
| Parametro | Descrizione |
|---|---|
title, frame_bg_color, bg_color | Titolo finestra, colori frame e pannello |
title_fg_color | Colore del mese/anno nel titolo |
nav_bg_color, nav_button_bg_color, nav_button_fg_color | Colori barra navigazione |
prev_text / today_text / next_text | Etichette pulsanti navigazione (default: "‹", "TODAY", "›") |
prev/today/next_button_bg/fg_color | Colori individuali per ciascun pulsante nav |
weekday_bg/fg_color | Colori intestazioni giorni settimana |
day_bg/fg_color | Colori giorni normali |
day_today_bg/fg_color | Colori del giorno odierno |
day_selected_bg/fg_color | Colori del giorno selezionato |
day_disabled_bg/fg_color | Colori celle vuote (giorni fuori mese) |
footer_bg/fg_color | Colori footer |
info_text | Testo libero mostrato nel footer |
january_text … december_text | Nomi dei mesi (per internazionalizzazione) |
monday_text … sunday_text | Intestazioni colonne giorni (MON, TUE, …) |
week_start_monday | Ridisegna il calendario con settimana da lunedì o domenica |
show_footer | Mostra/nasconde il footer |
Metodi helper AGGIORNATO
d e naviga il calendario al mese corrispondente.📘 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()
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()
| Parametro | Descrizione |
|---|---|
search_command | Callback aggiuntivo all'avvio della ricerca (la ricerca avviene comunque) |
cancel_command | Callback aggiuntivo alla pressione di Stop |
clear_command | Sostituisce il comportamento Clear se fornito |
browse_command | Callback aggiuntivo alla pressione di Browse |
open_command | Sostituisce doppio-click su un risultato (riceve path: str). Default: os.startfile(path) |
select_result_command | Callback selezione risultato; riceve (path, name, type) |
finish_command | Chiamata al termine della ricerca; riceve count: int |
error_command | Chiamata in caso di errore; riceve (message, traceback) |
Metodo Edit()
| Parametro | Default | Descrizione |
|---|---|---|
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_text | — | Etichette pulsanti |
status_text | "Ready" | Testo iniziale status bar |
panel_bg / panel_fg | — | Colori sfondo/testo pannello principale |
title_bg / title_fg | — | Colori etichetta titolo |
search_btn_bg / search_btn_fg | — | Colori pulsante Search (accent) |
results_bg / results_fg | — | Colori lista risultati |
status_bg / status_fg | — | Colori barra di stato |
Tutti gli altri widget supportano parametri _bg / _fg analoghi. | ||
Metodi di controllo programmatico
"Files", "Folders" o "Both".📘 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()
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)
)
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
| Metodo | Tipo | Principali parametri specifici |
|---|---|---|
add_label() | StaticText | text, 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() | Button | text, on_click, fg, bg |
add_checkbox() | CheckBox | text, value (bool), on_change |
add_radio() | RadioButton | text, value (bool), on_change |
add_slider() | Slider | value, min_value, max_value, on_change |
add_gauge() | Gauge | value, range |
add_choice() | Choice (dropdown) | items, selection, on_change |
add_listbox() | ListBox | items, selection, on_change |
add_listctrl() | ListCtrl (report) | columns, rows, on_select |
add_combobox() | ComboBox | items, value, on_change NEW |
add_spinctrl() | SpinCtrl | value, min_value, max_value, on_change NEW |
add_color_button() | ColourPickerCtrl | text, value (RGB), on_change |
add_canvas() | FGCanvas | bg, pen, width, mode ("free"|"line"|"rect"|"circle"|"erase") |
add_statusbar() | FGStatusBar | bg_color, text_color, sep_color, proportions |
add_separator() | StaticLine | orientation ("horizontal"|"vertical") NEW |
add_image() | StaticBitmap | image_path NEW |
add_menu() | CustomMenuBar | menus (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))
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
main_textbox/main_entry se nessuno è specificato).Dialogs e helper file AGGIORNATO
None se annullato.True se l'utente clicca Sì.{"path", "filename", "content", "encoding"} o None se annullato.{"path", "filename"} o None.None.main_textbox e current_file.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.
FGProxy.Modify().FGStatusBar — barra di stato personalizzabile
| Parametro | Descrizione |
|---|---|
bg_color, text_color, sep_color | Colori della barra e dei separatori |
proportions | Lista di interi proporzionali (negativi = proporzione relativa). Default: [-2,-1,-1,-1] |
font_scale | Scala 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
value: 0.0 (invisibile) → 1.0 (opaco).False la chiusura viene annullata (utile per "vuoi salvare?").📘 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
func() una sola volta dopo delay_ms millisecondi. Se fornito, name permette di identificare il timer per cancellarlo con DelTimer. Restituisce il timer.func() ogni interval_ms millisecondi finché non viene fermato con DelTimer.# 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
text negli appunti di sistema. In CALCULATOR e NOTEPAD il parametro è opzionale: se omesso copia il valore del display / la selezione.HTTP asincrono
Ogni modulo include un metodo per inviare richieste HTTP in un thread di background, senza bloccare la UI.
•
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()
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.