Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 11
1
salve, sto realizzando campo minato con turtle e mi cliedevo come posso far attendere il programma finché non si clicca sullo schermo per scoprire una cella.  Ho pensato di risolvere con un il del tipo:

wn= turtle.Screen

"turtle"? ... è forse l'esemplificativo di disegno con tkinter che si vede tal volta?

Se la risposta è "Si", non mi sembra una modalità adeguata per disegnare una interfaccia grafica per una applicazione dektop, anche se dedicata ad un "gioco".

Perdonami la domanda, @Carmen, ma hai già programmato interfacce grafiche?

Dico ciò perché una interfaccia grafica si basa sugli "eventi" : non è un programma esterno all'interfaccia grafica che "aspetta", è l'interfaccia grafica che scatena, tramite metodi di callback alcune azioni di una procedura che fa parte o è inclusa o è invocata nel thread della interfaccia grafica.

Suppongo Tu abbia implementato la parte definente le celle dati con le "mine" e le indicazioni numeriche di mine eventualmente limitrofe ad una cella "libera".

Suppongo, inoltre, che Tu voglia realizzare una applicazione desktop basata su tkinter.

Nel Tuo caso specifico, personalmente, utilizzerei un canvas come "sfondo" e "contenitore", dimensionato su di una griglia quadrata o rettangolare di caselle quadrate corrispondente allo schema calcolato e con su disegnate la griglia, le mine ed i numeri, ove opportuno, definenti lo sfondo, sul tutto poi stenderei uno "strato" di controlli dimensionati sulle caselle, canvas anch'essi, dato che devono poter disegnare le "bandierine", su questi ultimi applicherei il bind al calback che sulla base delle coordinate di cella scoprirebbero i "vuoti" ovvero le mine (con cessazione del gioco).

Non è un discorso troppo difficile ma nemmeno semplicissimo se non si ha pratica, presuppone delle conoscenze di base tutt'altro che "immediate".

[Edit] ... a pensarci bene, anche una "griglia" di label andrebbe bene, anzi, sarebbe più "semplice" da gestire, dato che possono contenere testo e mostrare immagini.

2
Buonasera , ho questo piccolo problema , devo leggere dei valori da un foglio Excel.
sto provando la libreria openpyxl che funziona bene, però quando devo leggere una cella che risulta il valore di una formula , mi ritorna la formula.

A giudicare dal tutorial, il supporto delle formule è limitato. Non conosco la libreria ma mi ha incuriosito l'argomento, in questa discussione su stackoverflow viene suggerito l'utilizzo della libreria "xlwings" per le formule. Non conosco neanche questa (non uso excel) comunque segnalo.

3
Tkinter / Re:Tooltip in tkinter
« il: Gennaio 15, 2020, 16:25 »
Ciao @Paolo

Si, anche se ho ancora un po' (forse un bel po') di base da vedere, ho intenzione di cominciare a fare "qualcosa", in python, e l'unico target che credo mi sia accessibile, principalmente per le mie limitazioni culturali, è nell'ambito dei gestionali di tipo desktop, quindi penso sia ora di mettermi a studiare le GUI, sin ora ho guardato superficialmente tkinter e lo trovo nel complesso insoddisfacente, lo abbandonerò una volta studiatomi sufficientemente uno sviluppo con i pattern MVC/Observer in tale ambiente e realizzato una "tabella" decente.
 ... magari, se avrò tempo, metterò on-line un paio di piccoli script (completamente al di fuori della pep8 e dei canoni mvc) che ho realizzato con detto framework, giusto se possano servire a qualcuno, notizierò nel caso.

P.S. - il sistema dei tooltip per i menu lo ho esteso ai menu aggiunti con "cascade" ed è probabile decida di estenderlo anche agli item tipo check-button (per alcune opzioni di ricerca), magari posterò anche tale evoluzione, anche se un po' ozioso, la metodologia è già dentro quanto postato.

Ciao :)

4
Benvenuto e regolamento / Re:Mi presento
« il: Gennaio 15, 2020, 12:03 »
Ciao @Cristian, ben venuto

5
Base / Re:limiti delle istruzioni condizionali
« il: Gennaio 13, 2020, 13:27 »
... perchè non esegue?

???

Ma lo sai che è una "strana" domanda? Una concatenazione di "and" è vera se tutte le condizioni poste sono vere, falsa altrimenti. Evidentemente, almeno una delle condizioni poste è falsa. Esempio "al volo" :

Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> id_spyder = '1'
>>> id_snake = ''
>>> data = '13012019'
>>> if id_spyder and id_snake and len(data) == 8:
print('Svuoto DataConsoleList')
print('Aggiorno DataConsoleList')
else:
print('Non faccio nulla')


Non faccio nulla
>>> id_snake = '13'
>>> if id_spyder and id_snake and len(data) == 8:
print('Svuoto DataConsoleList')
print('Aggiorno DataConsoleList')
else:
print('Non faccio nulla')


Svuoto DataConsoleList
Aggiorno DataConsoleList
>>>

Come vedi, passando id_snake da "vuoto" a "valorizzato" lo "if" viene eseguito nel secondo caso, mentre nel primo no. Evidentemente Ti trovi in una condizione simile.

... forse, dovresti  infarinarti un po' sulla base dei valori booleani, questa pagina mi sembra fatta in modo piuttosto chiaro e semplice, una lettura non sarebbe male, fai particolare attenzione alle tavole di comparazione tra valori booleani.

6
Ho fatto un tentativo. Modificando i permessi del file.py
chmod u+x python3 nome_file

Quel "python3" non ci doveva essere, loggati quale utente normale, quello che deve utilizzare lo script, spostati nella direttrice che contiene lo script di avvio della Tua applicazione, diciamo indicativamente main.py per il resto del post, e dai un semplice :
chmod +x main.py


Ciò attiverà l'esecuzione dello script "main.py" per l'utente che ha assegnato i permessi.

Dopo di che ho inserito :
#!/usr/bin/env python3

Se da terminale lanci lo script con "python3 main.py" (main.py è indicativo) va bene così

Ma a doppio click non esegue come vorrei aprendo una finestra shell che chiede se eseguire o aprire ...
La procedura indicata è per definire una voce di menu od un lanciatore per l'ambiente lxde, NON per definire la attività da avviare nel file-manager, utilizzando le metodologie indicate nei link che Ti ho proposto definisci una nuova applicazione "di sistema", intesa come disponibile nel tuo ambiente desktop, Te lo avevo già indicato proponendotelo, così come Ti avevo precisato che evito di interferire con il file-manager, programma terzo.

Quello di cui hai scritto su "forse" può essere fatto con il Tuo file-manager ma non lo ritengo una idea grandiosa, comunque, dovresti trovare prima di tutto quale è il file manager in uso e poi vedere come intervenire, se possibile, sul comportamento da tenere per i file con permessi di esecuzione, alcuni file-manager permettono di eseguirli direttamente, altri dietro richiesta di conferma, altri ancora no ... in ogni caso, personalmente ritengo l'inserimento di una applicazione da utilizzarsi con una frequenza in menu vantaggiosa, il "doppio click sul file" ozioso se non controproducente, principalmente in caso si debbano alterare i tipi-myme, il terminale permette un controllo migliore, poi fai un po' Tu, ma indica quale file-manager utilizzi se vuoi percorrere questa strada.

Creato file vuoto, configurato.desktop
E inserito all interno del file.txt :
[Desktop Entry]
Version=1.0
Type= Application
Nome=nome app
Comment=commento
Exec=percorso file.py
Icon=percorso immagine

Salvato ed effettivamente mi crea l icona ma al doppio click non esegue nulla...
Questa è la strada che adotto normalmente, fermo restando quanto detto sui permessi e che "percorso file.py" DEVE essere il percorso assoluto, per non dare problemi, verifica e riprova se, dopo aver assegnato i permessi al file di script hai l'applicazione funzionante disponibile, eventualmente prova anche ad inserire un "Terminal=false" od un "Terminal=true", possibile che l'impostazione di default (non so quale è) non vada bene.

[Edit] Rileggendo
Citazione
Creato file vuoto, configurato.desktop
E inserito all interno del file.txt :
Ritengo che quel ".txt" sia un lapsus e Tu intendessi ".desktop" ... dubbio coseguente : dove hai creato il lanciatore? Sul desktop (scrivania) o in "/usr/share/applications. "

Una volta verificati gli accorgimenti di sopra fai sapere, così come su cosa pensi ed intendi fare per il "doppio clic nel file-manager.

7
Lavoro su raspbian lxde da raspberry 3b+ con python 3.8 ... Ho letto diverse tecniche in rete ma non funziona ... Qualcuno cosi gentile da guidarmi nel procedimento ?

Purtroppo, non conosco tanto raspbian quanto lxde, ma in vari ambienti linux che uso (debian - Ubuntu con Gnome/Unity/Mate) ho configurato vari script bash e python ad avviarsi con doppio click tramite "lanciatori".

Ora, Tu non indichi "cosa" hai provato a fare, in conseguenza non saprei se "posso" darti una mano o meno ma, riguardo ad lxde, a giudicare da questa guida, possono essere aggiunte voci di menu "personalizzate", anche in modalità grafica, suppongo che già questo possa esserti utile, sempre ammesso Tu non l'abbia già provato con esito negativo, personalmente, in ambiente Mate, mi son costruito proprio un blocco di menu per applicazioni di utilità fatte da me.

In tutti i casi ho sempre e comunque utilizzato una Shabang quale prima riga dello script da lanciare, tipicamente, per python, uso "#!/usr/bin/env python3" ma, a volte, faccio diversamente, a seconda delle necessità.
In nessun caso imposto dei "files" apribili con doppio clic direttamente dal file manager in uso, anche se "potrebbe" essere fatto, preferendo pasticciare con programmi "terzi" (quali un file-manager) il meno possibile.

Ora, se non Ti va bene quanto nei link sopra (ricordandoti dello Shabang), esponi come vorresti avviare la Tua applicazione, come hai provato a fare e cosa non è andato (errori restituiti al tentativo, etc.) se mi riesce cercherò di darTi una mano.

Ovvio che se vi sono altri utenti a conoscenza della "problematica" raspbian/lxde leggerò volentieri :)

[Edit] P.S. - Riguardo alle "icone", le personalizzo anche, in maniera diversificata secondo il D.E. in uso.
[Ri-Edit] - Dimenticavo : nei Tuoi tentativi, hai provveduto a dare i permessi di esecuzione al file di avvio?
genericamente :
chmod +x nome_script_avvio



8
Buonasera, ho questo problema, devo allineare in colonna dei campi decimali.  alcuni numeri sono composti da 3 interi e 2 decimali, altri da 2 interi e 2 decimali.  ...

hai diversi ordini di "problemi".

Il primo è relativo alla "formattazione" dei numeri. Dato che ciò che devi visualizzare è del testo, è sufficiente passare alla label una stringa formattata come float con un numero di decimali fissi, formattandole tutte nello stesso modo, Ti faccio un esempio, diciamo siano tre decimali,

>>> num = [10.0,5.325, 0, 19.15]
>>> for n in num:
str_n = '%0.3f' % n
print(str_n)


10.000
5.325
0.000
19.150


Qualora poi Tu voglia utilizzare quale separatore dei decimali la "virgola" invece del "punto", senza andare a scomodare i metodi di "internazionalizzazione" che un programma un attimino "professionale" implementerebbe, ti basterà utilizzare il metodo "replace()" delle stringhe

il secondo "problema è dato dallo "allineamento" del testo visualizzato. Tanto le celle di griglia quanto le label hanno quale allineamento predefinito il "center" che però può essere liberamente impostato, tramite "sticky='w'" per le celle di griglia, cosa che hai già fatto, tramite la proprietà "anchor" nella definizione delle label, che provvederà ad allineare testo ed immagini rappresentate secondo l'indicazione espressa, quindi, prendendo una delle Tue dichiarazioni, la seguenza
        self.b3s.grid(row=3, column=1,  sticky=W)
        self.b4s = Label(quadro_centrale_device_suoni, text=self.b4s_suonolink, bg= "#F0FFFF", anchor='e' )
        self.b4s.grid(row=4, column=1,  sticky=E) 

dovrebbe rappresentarTi la label "self.b4s" allineata a destra con testo allineato a destra.

Ciao

[Edit] sto ancora dormendo, è "e" che ancora a destra, "w" ancora a sinistra, corretto il codice riportato, per altro c'è anche ila proprietà 'justify' che permette di definire un più esplicito "right"

9
Ringrazio di informazioni e suggerimenti, li seguirò.

Ciao :)

10
Tkinter / Re:Apertura finestre tkinter
« il: Gennaio 09, 2020, 18:48 »
Buonasera,
io ho un problema con l'apertura delle finestre tkinter da desktop. Mi spiego: se sto scrivendo un programma dall'IDE di python è clicco su Run Module tutto funziona perfettamente e non dà nessun messaggio di errore, ma se clicco sull'icona sul desktop si apre una finestra e si chiude subito.
Grazie

Ciao @NBIACROT

Comprenderai che senza aver indicato il codice e tanto meno il sistema operativo (e l'ambiente) su cui dovrebbe essere inserito la domanda posta è da 1M$, come si fa a dare una qualsiasi risposta?

Supposto che il Tuo sistema operativo sia una versione di windows, c'è un utente di questo forum che si è dedicato parecchio a redigere una guida per gli utenti di quel s.o. (io non saprei proprio che pesci prendere con esso), in particolare, una delle pagine è titolata "Avviare con il doppio clic", Ti invito a leggerla (assieme al resto) è possibile Tu risolva il Tuo problema, in ogni caso di certo ne beneficerai ;)

11
I miei saluti

Nel corso dei miei tentativi di studio di alcuni pattern mi sono imbattuto in un tipo di notazione per me nuova in python, ossia la dichiarazione di tipo per parametri e return di un metodo/funzione (pep's 3107 e 484) ... devo dire che mi ha fatto piacere trovarle ma nel seguire un esempio così posto :

from abc import ABC, abstractmethod
from random import randrange
from typing import List

class Observer(ABC):
    '''
L'interfaccia di Observer dichiara il metodo di aggiornamento, utilizzato
dai subjects.
'''

    @abstractmethod
    def update(self, subject: Subject) -> None:
        '''
Riceve lo update da subject.
'''
        pass


class Subject(ABC):
    '''
Oggetto interfaccia, dichiara una serie di metodi per la gestione
di subscribers.
'''

    @abstractmethod
    def attach(self, observer: Observer) -> None:
        '''
...


Mi son reso conto che, almeno nella versione 3.6.9 di python che uso, la notazione è valida solo se il tipo di oggetto dichiarato quale parametro è definito precedentemente alla dichiarazione stessa, altrimenti si ha :

Python 3.6.9 (default, Nov  7 2019, 10:44:02)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>>
======= RESTART: /media/nuzzopippo/progetti/mvc_example/observer_ex.py =======
Traceback (most recent call last):
  File "/media/nuzzopippo/progetti/mvc_example/observer_ex.py", line 7, in <module>
    class Observer(ABC):
  File "/media/nuzzopippo/progetti/mvc_example/observer_ex.py", line 14, in Observer
    def update(self, subject: Subject) -> None:
NameError: name 'Subject' is not defined
>>>


Problema aggirabile facilmente, omettendo la dichiarazione di tipo
======= RESTART: /media/nuzzopippo/progetti/mvc_example/observer_ex.py =======
Subject: Aggiunto un observer.
Subject: Aggiunto un observer.


metodo che però non trovo gradevole, provato a rileggere dette pep's con l'unico risultato di "incartarmi", ho capito poco e non ne sono venuto a capo (anzi ho trovato un sacco di ulteriori cose da "vedere"), anche se ho il sospetto manchi un
from __future__ import annotations

disponibile da python 3.7 e che sarà "consolidato" in python 4.0

A parte il dichiarare gli oggetti "parametro" in moduli diversi in caso di incroci, o di omettere tale dichiarazione, qualcuno conosce una metodologia più corretta per la definizione di tali parametri incrociando oggetti definiti nello stesso modulo?

12
Sto facendo del mio meglio per imparare quanto piu possibile da questo primo programma e in base al tempo a mia disposizione, purtroppo in rete trovo molte cose ma non tutto e non sempre comprensibile...

Capisco, spesso è anche per me poco comprensibile ciò che trovo ed ho passate esperienze di confusi tentativi ... tali esperienze mi portano a concordare pienamente con i concetti espressi da @RicPol : così come stai procedendo giri essenzialmente a vuoto.

Se,  come appare, se all'inizio della Tua esperienza in merito alla "programmazione" fai tesoro del suggerimento ricevuto, prendi un buon testo in materia e seguilo passo passo, partendo dalle basi (le interfacce grafiche sono argomenti complessi), vedrai che "risparmierai tempo", te lo dice uno che ne ha perso davvero tanto.

In merito al Tuo problema
Comunque ho provato con la riscrittura proposta da nuzzop.
Se eseguo indentazione di return rows differente  nel codice della funzione in background non mi restituisce la lettura e "str" ha valore nulla inserendo ugualmente id a db , escludendo l istruzione return vi é ovviamente lo stesso problema mentre lasciando l indentazione invariata esegue correttamente la condizionale ...
guarda che con questa indentazione
Def ctrl (snakeID="") :
Con= sqlite3.connect ("spider.db")
Cur= con.cursor()

i codice che segue "Def ctrl (snakeID="") :" NON fa parte della funzione "ctrl", non ho mai provato a scrivere qualcosa del genere ma credo che NON dovrebbe passare nella interpretazione del codice. Mi lascia molto perplesso ciò che dici, probabilmente vi è un insieme di particolari che mancano.

in merito a
La parte di codice che non é chiara (snaklist.delete(0,End)..............)
É la pulizia delle lista successivo inserimento dei dati "esemplare" appena scritti  in database...

Spiega perché non mi è chiara : le Listbox hanno il il metodo "insert(index, *elements)" (leggi al link) che permette di inserire un ulteriore elemento alla posizione voluta (anche alla fine) e Tu li hai i dati relativi...

Ciao :)

13
Sto ancora cercando di ricreare la funzione con istruzione condizionale per il controllo dell id senza successo ...:
Ho scritto la funzione in background:

....
Con.close
RETURN rows

...
Ma non funziona

Ieri sera stavo già dormendo quando ho risposto : "RETURN"? Hai scritto proprio così nel codice? Se si, con cosa lo stai editando?, di certo NON può essere eseguito, scritto come riportato, le indentazioni sono "sballate".

Per altro, Ti ho indicato di uscire senza far niente con la variazione in "addsnakedata", certamente potresti anche emettere una finestra di avviso e poi uscire, l'essenziale è non eseguire nessuna operazione in presenza di snakeID già registrati e permettere la correzione del dato.

Comunque, credo che Ti sarebbe utile dare una scorsa alla intercettazione degli errori in python.

Ciao

14
Supposto che snakeID sia una Entry o una StringVar, e fermo restando la funzione ctrl esposta, prova così


def addsnakedata():
if(len (snakeID.get())!=0) :
Try:
if ctrl(str(snakeID.get())) : return
snakedb_backend.addsnakerec(snakeID.get(),
snakeSpecies.get(),
snakeAge.get() ,
snakeGender.get(),
snakeWeight.get()
)
SnakeList.delete(0,END) # <= da qui non capisco bene
SnakeList.insert(END,snakeID.get(),
snakeSpecies.get(),
snakeAge.get(),
snakeGender.get(),
snakeWeight.get()
) # <= sin qui, ma Ok
Except sqlite.integrityerror as è:
Finestra errore()


Ma, tieni presente, che programmare non è tirare ad indovinare o tentare : analizza il flusso del programma che stai implementando e, dove hai incertezze, fermati. documentati su dubbi e problemi ed approfondisci.

15
Tkinter / Re:Tooltip in tkinter
« il: Gennaio 06, 2020, 13:37 »
infine, per completare l'esempio, risorse.py, 290 righe, la tabella, se vi serve (ammesso l'argomento interessi qualcuno), copiatela dal post prima lincato
# -*- coding: utf-8 -*-

icoanagrafiche = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAD8klEQVR42mIYGcDPVIIp0pA3KdhEYo6
XgXiNu66YIFUM9rAUmZpszfM/yVzwf4SN4n9fQ4mLUbZKrAQ1ziiPsZ1dFb9xXX/ZsZ1zWpt2zG7mhM
l5motxe1oL/WzNdQUUSw9AriQBGIBztm2jeLZt27ZtrW0rl7XtDZZxVtFk4mQ2th//m+xZuSu+rmp3f
01IevIhn2Li2ZvOxQMXH3/df6FXV3/29Namb1/GdGMmxAM1mKj9YXiClbXZ/83rt56W/9kD8MvHELWu
0nEF08x0vH7X+Q+lhKs+fapX1F2EKWYOhqq+x2JXOXoLP0LDVy+ck+wnOMwTyKnKHSGCjbhdhRi1Cpe
0F/z2zDtSwn2F7wv862OIGMWIUuuIWlagmmah9vNnbkj2S6W1DM8SsymgoMcY+AiRs7DM1ifmf/zy3+
9YM9Ow+2p/oTWgmKRhCWJJmD6uZ20Cgta0l34d5+ZWnOIWtuwMrA/Bv9yD4o/uiN51+YG7pdyxmVvHD
qyP0rAQMYsMUZME/vXRhHK4+Ixfx7gWGxnkSH6M4laDHC3Cu/eese3Ry/fbNyXsXGg42ydp3x5WTyOq
nUWYYMMn625J9nE4nOPX2W23uRdqs72yXtj5rfDQ9/vRnSejO/2p93hc7k1c9vTe/4rb5uoGaByBlV6
4ha2QDRTf4OKVv+m06hJOQgAPnwWvpBNeaTccNP7B1Qeg7dunEYlEsLHUSjjZRUf+I7w20/ataqIKyp
ESiAfKQfJazvUIWHGXVQcnKYZP2gUvvaCPxte70vD+5fvhm3vPQTweh03UA/diw+f/CPuMKzXEQj8mm
dkg+YNwSAYKPMIWOMwkHLoVJMseUTK2oj/jWbx62cF46ZKDsGHSgRJ0ws1nLv6GqTQb+5N6x/Nmq2fe
ZnPtJGVzEIy3w0ysIRyKIGAlQJkMMKlXYF9kwSVsg1PQhumy91D65u0YqPoBNpsNWi5rp5HdOLWJsuc
UN2h0dofbE0I4Ekc0lkA0mkCEjtHYFsTiWzbzYCgGt9sPiWRFLxSIk5ES8EUG/qJoeXFBNMCZmf+67I
eMC6+46KPdGdJV0x5rCrPe5vBvojT2rzEYpmFvCC5PsOiEw5/c/fSTXtrjhMOe3v3QAx/8+x8WyXQ3a
XQ2UDYvQuF4yhgIRmF3BkBvwmoyenZnpAqceUWa3uSEweSC1x9GIBT715jcLWXz0dG7fXndeEZKOL9q
fL+OAf7zS2JNp1JDqejd+wmdLaHSUNvkast2BWHdSrfHlARlX5GbBAtCoqShlXdFSekQ43+FR9LSGBW
N3N2qmtj7FtdOHl5YM3FMUe3EcYXVE0eV1U8fVMlk71lSPsnY5eEnEecbPy8tyA8AAAAASUVORK5CYI
I=
'''

icoannulla = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAEHklEQVR42mJITk5mYmBgEARiUQqxUEJ
CAhMDEpD7TyUA4KMcgBzLojCcwtrFKaxt27Zt27Z3p23bSnpsxOm0bWPVjB6Dzr/nnTHSt+q/yqsvF1
9dYp22N/h0ADD3u2ChmPrmYRv0cF9rrYNuWPu1uGAdcGtjjo362jfmvgUYu+d2gc85APxnRiUqNzfCM
ehCjn4rYjIr8O3yNGRVbkJ8nh45NVsQn6tHStFqLM8oR1RmGWrNnagbZHhksJlWurn9b/7IwquYxbbO
adiHfNhOfW3O1DPH87ZBL3ilPbvmlwCLPi9EwQPB54Ys+qBI4j7xyxL8igRVFhBQZI42DqoK/S5EBhc
UFKCxsRE+nw9lZWXYvGUL9Ho9Vq5cCbvdwb+vW7cODocDefn50BsMPM7OzkZ3d3dksM/jwtzMNK9clU
UIXg+m//mb2/m5aWrdEOgbUfDyjnaFxjTvjgy20C2zBf0uPlftHG1De2If9vG8Y1hA3YgIx4jA/R0GL
QH+KaEAebVG1I94EZdbjcT8WnwflYHSdXVILlyBBDIjz7CNjChFFFnxZ3opforPQeOYQItZcsUeuv2Z
nf56YeyaYQu0mHvnKXPkroctsA6Q72SHieYt/drYExksiwKfrSwJCKgyggEVQb+KUEDhccDPc1gMqgi
HAgCFBtxfDPkjg0tKSrB9+3ZIksRWGI1G5ObmYv369VAUheP3+xEIBBAMhRAGF+4Hg0HuaywNuHJvMH
nKPqqSSCtV2F0fmeBXJYqMxZ0rpIoh7Z+8h87vvsbeJUqnW+O49bq1+6zYOuCFVbOC7Nh1+84xGc5RC
XVaf1RAw7iC5hlg4113wPvjV5j77RuseuMDNAtA87tvhF2/fAMh5nesPWlZ9W7wF7+nonyDk61IL1uP
5OKV+OCb35FasgrRWeWo2tKMH2Ky8HNKETJvuw2jbzyGnseeQP/nb2L5Jedh8OPX0fPoE5j47gOUHXX
oz3tWTCawFQMuaqf57bCTv+yztotBD/nMO4JtKoCaF95A15M3wXH5Veh9+Sm0PPgY+j9+Blk63R+6/c
6Yz1NVJLpwlcO3j0XsW8J83lqpvOFiNF9xJrYdfwKcFyxD2vGH12tA/d7glJQUNDQ08O3X1NTwu0FG8
FthMBjgdDpht9tRVV2Npq4ulD33JHqvORUtOh0GL+UWfXdciOijj4jf12NZhsvlgiiKUFWV+/QnPE8K
ctxuN4LhMNZ89hH+vu4C/EewpntuxGM3XxvuvON6TNN48p6bkXPlFbEM1vxcWFjgEHD/MHBXXIKAnMc
fgnLZRRh/+F48eOmloZ+WLxdvPfWUhX/vvR3eG69B5v/T11nMoK+vzw403AyIrYnGXJyWveYGO+OFBC
awCglZCAoKGjNoagpXKylMXmFlsQzkWgAF/hUIGnXFJgAAAABJRU5ErkJggg==
'''

icocancella = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADxklEQVR42rXUA5AcaRTA8WvdzMW2k7U
R25nYtu2kcNbclWLbtr3G7GRvrc7Yax7n6373umondrKv6j9+v3F/AQBV0kct4TTbvGDe44WTJ+crFA
oTx3FbPhnGabI2NDg8d+N6oSQ2Rji6Y4ewcOHCIsT34n3UR8E4jVcFB4RZFs4V7LOmQe7PP0JFQYFw7
NgxYcWKFRJ+GB9DfxCM02hlgN9Dw6xpgmnyBLBsXAcFNqtYXFwMpaWl5OjRo8LatWuLZDLZSemVvy/a
YImX533NpPGCbvRIMK5eCXkWi5hvs0FRURFIeJnVSo7t3CnMnj3bho/n3getv9Dd/V72qBECrxgM2qW
LwWEyiTm3boF682awa7VgT0sldsUAKLp9k3yzalXRO2GcevPat7+dohgsZPTrC9nz5oFNrxezbt4EXU
wMGNRqsCYnEXPnIDC2aQa6TkHku6FDwqXP+W1onVlt2tz6o28fIblrV0ifPh0sOp2oTUiA1DNn4ElEB
JgSHxNdoC9omtSDbLc2ZCxLXZb2pP03ojNatbqh6tZVUAcHQ9LEiWDSaESzRgNply+DhBvUCYT39YCs
ejUhqbqMjGKeoVKvQ2tNbdbselxICEnw84OksWPByPOi1WqFsPXrgY+OBp1KRTI6tIXU6jJQcTQZTlF
XnqKvg3FqTm7U6EqMjw+Jd3ODxOHDQZ+dLaZevQqqnTvhiUoFmthYZ0rr5pDIURCN6FCauvoUfR2MU2
NMw4aXotzcSGyrVqAeOBB0mZliFn6W6oMHwcDzkBMV5VQ3bQwqloZHHEMG0+xT9I1wjx49+k1VKEp3N
Gz4r6pPH9Ckp4sGvR6ilErIwVeaHRnpjGvSGGIYGu6yDBlEs9fehD6Fu3fvPvDAgQPleXl58OPateLl
Q4eIHlFXmeHhzmhEIxC9wbKkP81dfxsqJU3b3bt3FxQWFoIE22w2+PVXpXjx4sX/JDQjLMwZ2aQJhDE
MXGM50vc9UBdM+fv7H+R5/m+HwwF2ux0sFgsof/tdPL1161P0KqJ9aO7G+6BSLp3y8/M7mJmZ+beEms
1mMBgM8O3yFaJSJv/3ioSyspvviz6FMdcrP5CWlva30WgECdbpdDCgU2dHN/bLe3h/G6wGJsPo94IrF
1pjQd7e3meSkpL+1mq1sGzZMptcLu8k3f+Wz5LCWEwu5Xrip8darAs2Hlvu5uYWNnfuXBseuBfh9QFY
H6wH1hkLwfwxPyywMi+sDdYEq+mCn4bzFdYYc8d6VmL9scGYAutXiftgbbGmWF2sOsZhlMv6H9EsWMP
XC538AAAAAElFTkSuQmCC
'''

icocerca = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAD7klEQVR42qXUU4BjZwMG4NXV/19Va9v
escu1bdu2bds7tm1bsZNJJrbRvj1J7Ta5eI/P8/nrAOBvk3TvSMfcF2e7Oq//S/4O/H/hmwt5qQ+P29
OfnEZJxG1bdfyD+Kzn5zt5BOc8P0tJfXwKRAEoibqL1vwY0MtTUZvyvNRtuODNhQXxdw4h88U5JNw9h
uw3V1Cf8Q6Ukng0ZL5HwdvLPd2CSz5c/dCS+Qw6RhH0glYwq7MgaCqEmFqOoog7KAu/stktuDz6Vqqs
IREGTiXMYioschasSh5x5oDfkIu6hLuH3ILp+W+fa0jpMPBqYJbQCJANq0oAi4ILHb8JzMJ3N9yCBVX
xNzXkH2EpActYsLhqzCYKoti5pVHT3IL5ZZE91c2pJAOnAhYJGRYpHVYZgzjToOfXZXs03cTV0Tf19F
yY+JWwiBqINLrS3pBxwDO44t3HgqooGBgFMHLKYeJVglkeh7bSD//zCHaGVBxjFNcRs4OeD0FVLBrzI
lTO5x7Dan6zQc6uR3Xaa9RlfYCIUib3GBaLxJuMSiF0QgpaCmPRnB+NNkYTqsvLH9jtjp/3i4ULF3bO
TM9cWnjmTJe/hJVK9Sdisfa0SKIWaHUmiCSqb9tFEjBJjWBQqdi/bx8mT5wMrdYgMJlsp202R/dpU6e
WjBs3DkcOHmr+U5jFkV4UtmvsOgI0Gi0wm21ErLBa7SC1krB9y1bMnj0bc2bNxorlKxEcHIYL5698Fx
Ic7Jg3Zw4O7NuP8PcfGG9evR77M8wTypeLxGpotARqssJCYGaLzXWmM5g4euQopk+bDj8fXwT6+RNnP
1y7cg2rVq1BgF8AAv0D8EXY59i3Zw9ePH0m/Bkm04QiiVwDovlO8Dd58vgJrl+7hh1bt6Fr164YN2Ys
gfnj6NHj8PHydqHeXl6Y+vU3uHj+PGKjY5CbnbOzg1Jl68YVyCCWaaDWGmEgusFktrrS3NwKP28vTPc
dj61L52DK2DGYOGEithHdcvzYScyZPQd79+zF2tVrMH70KMwK8sLW5fMxf+5cY4faRs5dhUqPdqkGUr
kOeqPZ2R2unD51Gj4DPsMOn9449sVQTB3+GdauWYtzZ89DpdYhP78Ihw8fhY+3D0IGfoztQYOwz783f
If0hKsrUrLqb1AZIoNApIBGZ4bO8ENfV1ZUwW94P7ycPwoJy0bjm9F90EqiurpMrtSjTaSG87/58xbK
Z47oijeLxyNq0QiEek00/Wa6nTlzplN8Ws3Aynrmrupazu2qBnbs1ev3+LND/e2z/MY57t57QqquZ92
prGXuziokDXZ+7/xvz85dXWfOnJmx0G+0efHMqczDBw8Ffg9k2YKUN2tSDgAAAABJRU5ErkJggg==
'''

icochiudi = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAAATCAAAEwgG8z5AYAAAAB3R
JTUUH1wwbFgwO0qEGYQAAAAZiS0dEAP8A/wD/oL2nkwAAA/tJREFUeNq1kl9oHFUUxr/7Z2Z3NtmQCk
1JpKRNSZegYBIjRBpIRdKG4EOMhZoGoa0QNKIoSvyDiKAUK2KNT3mQUvrUp/pYaShIFYmi1tokJjZrw
m5TRchusrvZndm5M+OZ22xa1iLinwMfc7hzv9/59uzgv6ggCELtINVXzhgJmXPndnuzs6fXp6Z6VDbL
g4qB9Hf7e/btC7b19/+8urzcv3t8PCVB5S0vTRoHD+4XXV3gnvfX6XD38qREwffbVj89/xGAIQ1Onj3
bG2/YAVUu49+UE49jZWm5H1QanJ1fkEYmc+tnMYZ0XR1Az525HJjv3z055/peWDvX18Foz0wIFG3b3A
J7JHdjAyHCTiSw/8ABMAJ/feEC6pJJoBpO0FxLCx4ZGNB/3A8XLyK6sABumvAqV0hQm2BFSuzdSz6uw
V00wG5thSqV9DuS7kt01tnXp6F0V3sq7xRjVeBCAWXSwpkzsNNpCulrY1tvL9DZCWUXtfyODiR6euB5
HpRSKKVS2kNeDdaJt1ZBU91iUYPCujoxgfvGxiCbmvTZru5u3JRc940PPhRCda9WVjA3OYnAdaE5jgP
vzsS+lHoV5YrW1jB36n2oG6kQotM3tHdi+wMdYUotfyWNhY8/gMqtwaWkPBKBm8+hbNt3JBYca4uLEJ
YFI2YhahmADyRPvYM9z78Kv6GpMkAnjeUyuHF6AtKz4eTWkf89i+TMTxCmAbfs3Ab7BM5cuwaPklhRg
Xh9hGTBr41i+ovP0f74kxpagV+59BnEpfNwii5KxCmGIRXAYtHqVQiAAcSHKTwIVQR38lh/7Cl0DA3r
lKQt+K6BJ+AcewVWjYGoCUQM8knyS14N5tQxSAmtiGXCH30NDx8fgxBCf3p1N+dQ/9t8OEDDE4MjCEb
fhElrMwhshGAzBOM2OBCcuAQOE1ME68W3CfocJE3hnBN0FvzDIzAnRtCQWSSQoXX/4aOoffkEDPLQfM
g/J2a646TG199F97FnQqMGx1I/Qp08jBi3UWs4Gr59NYloNArTNNF+5Gnc+8ZJ7RUSBEYVePOguWWPT
ql1/Xtk3zoE5tpg4WwSUw6cEzQoPYtIJKLvNTU334KFnEpi2hkLDK7BfgBMjw4j/81l2Fe/wvJLg3BL
NsoKKDpAoQQ4ZcC1Hfw6PgQ1M42Nb7/Ed88Oay8TrMKFJFnbEq1+tjAjOBnBgStjh1ATBWIWQYQJZ3M
o8wEPQJmTAh/zLwxiwwYCRqAaCyJWC99bUxWwo1j8cn1726PO0i+QJhEiBDAJSrIN6kmSIyw9QEkC05
kyCWoBPAZYZhyZPIOr/CkNZox57zU2jtiFwiekPlqNxD8oITMqAKYCpY7j/6w/AJawBs33otZsAAAAA
ElFTkSuQmCC
'''

icocontatti = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAB9ElEQVR42syPAw8cURRGN7Vt27Zt2za
C2g4Xb6a2jaAKy6h2+z/qwer03Ukb1etNzsO93577xgekhV8W8+TJs7xq1aqffLr9J0qWLPkxf/78y/
9ZLNIrV66wdOnSP2KaJpUrV/74z2L98/7YcW6QHgtC9FwQpNfCIL0XBemr6bdYzgEvI9n/F88JceyVw
/HXNife2Jx8Y3H6ncXZd19lWOLiVjNCBB86hB45qEc25mOLnU8sdj/9Sud5SYgbT1Wsue2w9o7D+ns2
GzSb71usvfuVljOSENeZqJh5zWH2dYe5N2zm37SZed1i+rWvemgocXGVsYr+Zx2PgZrB522GX7QZfdm
i3uQkxGVGGrQ4GKbtYZeOx1y6nnDodcqhnx5Sc4JKXFxsmEGdXREa7A3TdH+Ylgdd2h5x6aSHVB6bhL
jgYJPywShVVIQaZoQ6uyM0/D6k3KgkxAW0+AeFNIWHmBQdalBcf0nJ4Ubi4jVr1rBjxw6UUhw6dIiTJ
0/KLnepS///xe3ataN+/fp/QjKJifv168fgwYM9ybhx4wQ5S016ksmxFw8fPpzRo0d7kqlTpwpylpr0
EhN36NDhby+WzP+J8+TJ82H+/PlMmjSJyZMne5K5c+cKcvZqEyZMQDLfBqxBPpDi4gKQBkJVE1RNAS6
DaYIBxi2mPYrvSLkAAAAASUVORK5CYII=
'''

icofoto = '''
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
'''

icoindirizzi = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAABwlBMVEUAAAD///8AAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1PD5GSkouNDYyODg0ODo2PDw2PD44Pj48QkJCRk
RGSkhGSkxGTExITEpKTkxOUE5OUk5QVFBSVFBUWlo6PTo8Pjs9Pzw/QD03Ojo6Pjs7PTs+QD5VV1ZWW
Vg5PDs6PTwpLjAtMjMuMzQvNTYwNDQxNjc0Nzc0OTo1OTk2OTg2PD09OzdBRURJYABMS0dOJgBOUU5Y
KwBYVlBZYQBbW1ZbXFxbXVxdXl5dZABdagBeYGBjY2NjZGNlZmZlZ2dmZmZnaGhna2loMwBoaGJpamZ
sb2xxc3F4eXN4enV5e3F9f3WBPgCBg3mFhnyJioCNRACNjoSRkoeSRgCWlouXSQKcdz+dTQSgTQCgoZ
6hTgCkfUSoUgKpgkirhEqsUwSsYgmvsK2zi1C2jVK4WQW7WwHDXgLExsbFYQHFx8fJy8vKzMnMaAfOz
s7O3M7Pz8/S1NTU1tbWZwXW1tTX2dnc3tre3t7e6//f39/g4uLg4+Dh4+Pj4+Pl5+fn6Ojn6ens7Ozu
7u7y8vL29vb4+Pj8/Pz+/v9LDIF4AAAAMHRSTlMAAAEDBAUHCQsNDhATFRYZfHyAgICAgICAgICAgIC
AgICAgIDz8/v7/f39/f39/v4jF3Z2AAABG0lEQVR42mNgxAqQhBWVsAkrqKkrYQrLabu6asszmts4IA
tLaXrX1PloyWb0ViEJS+q7l1VWVrjrhTa1IIQlNHxbu4Gg3d8yrAAuLG7hVd8MBg1uZoEwYRHTgP6JU
DDBz0QUIixkpNvRAwddOobCIGEZK9VJU5DAZBVjMaCwsmBkHwqIFJAGmx01JTU1dYp9UJAjmBEFtTKm
L2tqVl90enp8X87UnL4YqHDslNzc3ClJJSWZU4pyi6bEQoXj+grbCvvyqxuL+4raivrioMIJU4qKiqa
klZbmgRkJUOFEsANSysuzwYxEqHAyyLm1tp4ezp0gVjJU2MnJKTjcAAwiQlzsrPEJMzGzsrFzcHHz8P
Hz8nBzcrCzsTAxAADm/XIknp8IMwAAAABJRU5ErkJggg==
'''

icomodifica = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAADk0lEQVR42mKgBrgaEeB+zt39+wV3940
nk5JkkOXEgNiOHJwTxBTyZqPshyv+lv9OKCn9nyUv/7BVTEwKZrDPfzLAzy+AxukBZpIkgALw/Wsbv3
LjWdu2bXv3bJvhaW3btm1rNhOsdzzNsd5VVf7eTE8yne3kxfn61avUK3BnmuLkojy0rmfGugoVsKN0a
cwuVmyuAg9KpVJwud1wezzw+nzw+f3wcxw4ngcvCBBoRBGiJLHwfge85zrh3uZCNG9iRm5uLiZ3y0ns
blMs+XmxYj+q4HSUIyhPUAqKRaAky5BJJEmA+9JIPNuvQ5d2Zuh0OnRvUSzxaEPx+MZfS60lXsfXUxC
YoaqWBJQUMBBAgCQYDMJ763NwZ5tiZP/6MJlMaFmvLG6vKpY88Hep08QaR6JXbaygrGU6SLBgKIQQid
c2F/KVDvhoSktYLBbUN1fBpSWlcHp+aXvpUm99SqxWJDkqOB0lR1YaMjAcDkN4ugvBG30x++eeDLUac
3H4n5K4u1mHqhVzNhFnKEkJCqrgTFQBI5EIJNdlBO6Mw5YFw2G1WmE26bDpt9Kwb6uJ776cDmLMJSlP
sUw4Kxrk7Ajefxfntk1G48aNCGrC/C/K4enuyvji/YH46quvKDw6zVPDUgYajUYRkhyQH3yOO4ffQYv
mTdkEv86sAse+CvhyVhuMHz8et2/fpvCArLBctClrStBISIRs+x5PLn6GLh2bM/SD0bXgPlgOP71rRf
fu3bF//37E4/Gs8AAACBRdFD1+NBKGaPsD7lvfoV/Plgwd06+ANC2Hfz7LRaNGjTB79mwkEgkabTiYN
oFg+xPC/S8xdkgLhvbprMPTneWx5pfKyM/PxzvvvENnY2gsFtOGlbai34EXlz7AO2PrM7R9SwMebqqI
w/9VQPlypdCsWTPcuHEDL1++ZHE4HNqw0tb55A7s1zfgw+l90aShCVdWVMbDzTXQoqkFM2bMgM1mA32
pyWQSPM9h69YtPHsYWeFIhMGPrqzHtYNf4cTaPji4sCGil+uCc97HQ9tDCqrQtevW8nq9fgx7bdlgOs
PzZ0+wceE7OLNpOE5tGAb71dUISS4GPXv2TIUuWbqELygoGK2gmvCaVSvQolljnD+8BCHZzxCCsUuie
75GlyzmcnNzRyqoJkxnOHn8CHw+D4VYMmF2/LVrONJUhWrA2h/9gcvlIhe1lTMYDCNUqMb3NsnIN0zr
N0H/BwqZ8W4FlNUHAAAAAElFTkSuQmCC
'''

iconuova = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAC/ElEQVR42qTVQ3gsWRwF8PNQPezdi7k
Z27Ztc5vZjGfWY9u2J7Zt27addp9Xt9K3GnFS33eCwu87938bILmj4HMcwPd4Zv9P++vDfw+fCPsvbH
7/9/sr1XMvIweKvE8ckWqu3FZOwZ34AiPXFF7Db7u+5bctalq/1f6+JuMa4kN04Rf4S/jKwaFhDo+Mc
GR0jGPj4xyfmODk1JSWqelpTs/McHx6nCf8cQIvzriYr3W/xqcKoiiPZ4qi+Lp6TlxTVzQgVqXBwyOj
HB0T6AQnJie9wJnZWc7OzfHVyldp+M3A+2vv55OtD/Ge5Kt0+NG0q/hc10N8uO5+GqINxDd4XoMFKlv
6gnPz85xXc8bfZ1D5U2HA9/48+/dwnv2hnw5f9qkfb/gnnKf+6k/lb4X4Do0a7IvOquicigpwYWGBi4
uLNH5vJN4GtzoOvAvReEyDJerV0gUuLS1xaXmZAf8HEO9sDSsfgvgLcxqso54tXeDyygpX1JycfjIRA
x79BXj8j+BZH0DHrv0MvPav1fP7/wPxH2o0eEYsX6JqS4Euq6gATSYTzWYz321/l0gAEQeekAVe8Jcb
vjUWvLUcDEwDkagmFi9osFy+bCpRAVosFlqtVposJkZmRxLRoOF/MOInN3zGnyqapDUl0tGG36Fo8Br
UZPJEtdhsNg4vD/PEshOJtNXmyg+gQSw/ztW0AANIQID+BtE3yqOpLypit9tpspr4dvfbPKv6LBqLjQ
wsDiSS0YtsPItOHBCoDi+4dl/OVKC+oIjD4Vg3wpCgFyzaihHIjfJs6os6nU7fbAzrbeUItkDF3+K6L
LAh7LlhniPwRcV9ra2trKqqYklJCYuKihgdHT0E4PiNYDGGDdvKptXV1V6tCwsLTCEhIRdIbC28wRg8
24r/8/PzdbS0tMR61lmnXiGQDWExX99N820rzmdkZGjnSkqKrZdffvlNAtguLNB1YXFPWlq62jrPdNZ
Zp10ugT3D4iX566+/DoeFhZ27Fbrz7zzg8JSIrXQBclGELYBwFBUAAAAASUVORK5CYII=
'''

icosalva = '''
iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAA
DdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKbSURBVHjatZ
VdaxNBFIbf3U2CERpv9Cbpl5Sair0VxY9rFf0dFryRWj/Ab+pNQUjxF6g/o4K/QOidSEhKQWuRgtuau
JndnZ1Z58zEYZYgFkLfcOacsHOeffdsduPleY6jUImWG9eub0dRNOsHPu6uPEJZZbgn9D0AHjxPryBR
bbKHhGdYf70GKSTm5uZ23r5/N6XBAzaYXV5eRndrC+cvXcWJ48cwxBLGgizcAFWY/Cti6H75DCEENj5
sTFrHUkq01ltonmmCZ5ky6FmwhReBFkoXwzOJTqejwVLmsGCac6aAdAKClss+Nj51cRjdvDCPHDn1Ui
iWRMHxQnNBn8DzFTjwcOviPFypQwQwOTdZqoXmK4Qkt8axkEXHBKdLo00szfBxcxuH0ZXFKWQyJ6hxr
ViuYzpgwKpmSYbL56Zg3ZrVuB3al0PncWodm1HIfzjOBG3m2Oz8wGG0OHvKgjUnd8F0CUJQaR2fnT45
AsmNCVM7jrmgfgN2HdNcNJDEucCwhKdhVhY6ciMBZGTMsFzHZhSk1ft3MIaI5Tq2oxhbZHDU8fgafUD
oyfurl69WUavV/uts6fYS+v2e7p2eND9PIRww/VQ457YpDEM8ffwEaZqiWq3i2YvnsHJeAY16HXt7JR
zs79t+IbIiOOO80MiiiJqpdmEEoKxDcE4HQB/qD4KAWA5YCnqrFR0JocNTrgeDgQu1kXBu32jUX2808
HXnm3PzhJQxY36ppL8iSRIFScHiGBVRUXPsW6gbLGZqb0y1dtzv9YqOfS+49zMMW7WJCYJr0MqDh0h5
qm9STzU4QOt+8DtCzGLwNAWvVLC7u1sEd7a7b07PzCA82G8hh99ut1FRG+3zL6UNV98VKE0TXTPGDLB
ciigf2Z/pH6S7UJf/7+KAAAAAAElFTkSuQmCC
'''

setico = {"anagrafiche" : [icoanagrafiche, "Menu gestione anagrafiche"],

          "annulla" : [icoannulla, "annulla l'inserimento corrente"],

          "cancella" : [icocancella, "Cancella l'anagrafica corrente ed i dati associati"],

          "cerca" : [icocerca, "permette di effettuare una ricerca tra le anagrafiche"],

          "chiudi" : [icochiudi, "chiude l'applicazione"],

          "contatti" : [icocontatti, "avvia la gestione dei contatti associati"],

          "foto" : [icofoto, "associa una foto alla anagrafica corrente"],

          "indirizzi" : [icoindirizzi, "avvia la gestione degli indirizzi associati"],

          "modifica" : [icomodifica, "permette la modifica dei dati anagrafici correnti"],

          "nuova" : [iconuova, "avvia l'inserimento di una nuova anagrafica"],

          "salva" : [icosalva, "registra i dati inseriti"]
          }


class IcoDispencer:
    def __init__(self):
        self.icoset = setico

    def getIco(self, chiave):
        return self.icoset[chiave][0]

    def getDescr(self, chiave):
        try:
            descr = self.icoset[chiave][1]
            return descr
        except:
            return None

    def printData(self):
        for chiave in self.icoset:
            print(chiave, ':', self.icoset[chiave][1])

    def getData(self):
        return self.icoset

Pagine: [1] 2 3 ... 11