[PIPython] Costruzione e recupero dinamici

Giovanni Porcari giovanni.porcari
Gio 31 Mar 2005 16:59:59 CEST


Il giorno 31/mar/05, alle 14:46, Massimo Cecconi ha scritto:

> Ciao Giovanni, :)
>
> Allora dovrei aver capito il tuo esempio ma non credo che sia quello 
> che serve a me ed ora ti spiego più dettagliatamente quello che devo 
> fare:
>
> Ho il mio "form" che ha ben 20 righe e ciascuna di queste righe ha ben 
> 11 elementi che nella fattispecie sono:
>       - 1 TEXT_CTRL
>       - 4 COMBO_BOX
>       - 6 RADIO (in gruppi da due)
>
> all'inizio creo un dizionario vuoto in questo modo:
>
> parent.Listing = {}
>
> poi ad ogni termine di riga aggiungo al dizionario questo:
>
> parent.Listing[1] = [parent.nSLOT_SLOT_1, parent.MISSION_NAME_SLOT_1, 
> parent.AIRCRAFT_NAME_SLOT_1, parent.AIRCRAFT_NUMBER_SLOT_1, 
> parent.TYPE_ENTRY_SLOT_1, parent.RADIO_FRA_SI_SLOT_1, 
> parent.RADIO_FRA_NO_SLOT_1, parent.RADIO_114B_SI_SLOT_1, 
> parent.RADIO_114B_NO_SLOT_1, parent.RADIO_LIMA_SI_SLOT_1, 
> parent.RADIO_LIMA_NO_SLOT_1]
>       che in poche parole sono i nomi di tutti gli elementi creati. 
> Alla fine dunque, avrò ben 20 elementi nel dizionario ok??

Si. Ok. Ma non ne capisco la ragione.
Seguimi:
tu aggiungi a parent un attributo Listing che è un dizionario. Già 
questo a mio avviso non è molto 'logico' perchè un dizionario si usa 
principalmente se devi accedere con una chiave non numerica. Ma nel tuo 
caso basterebbe una lista.
Poi riempi il dizionario mettendo ad ogni elemento una lista di valori 
che prelevi sempre da parent.
Cioè ad esempio parent.MISSION_NAME_SLOT_1. Il che significa 
implicitamente che parent ha questi nomi già come attributi. Giusto ?. 
Secondo me creare questo dizionario non serve e ti do appuntamento alla 
parte seguente per vederne la ragione .....

>
>
> Quando clicco sul pulsante invio, richiamo la funzione che deve 
> inserire i dati nel database:
>
> wx.EVT_BUTTON(parent, ID_BUT_CONFIRM_D, ArchiveSlotProgramDay)
>
> nella funzione ArchiveSlotProgramDay ho questo:
>
> db_BSS = sqlite.connect('CF_BSS.db')
> BSS = db_BSS.cursor()
>
>
> Slot_From = 0
>    Slot_To = 20
>
>    GET_VALUE = parent.Listing

Bene ora assegni al tuo dizionario anche il riferimento GET_VALUE.
>
>    while (Slot_From < Slot_To):
>        Numeratore = (Slot_From + 1)

ecco qui sarebbe più pythonoso fare:

       for Numeratore in range(0,Slot_To):

>
>        ID_Autoincrement = NextNumIdSlot
>              LIST = GET_VALUE[Numeratore]

ecco in questo punto ritorni al tuo dizionario e ne prendi l'elemento 
numeratore che è la lista dei valori salvata precedentemente.
>
>        N_SLOT = LIST[0].GetValue()
Qui prendi del primo oggetto il valore...e via dicendo per gli altri.

>        MIX_NAME = LIST[1].GetValue()
>        JET_NAME = LIST[2].GetValue()
>        JET_NUMBER = LIST[3].GetValue()
>        ENTRY_SLOT = LIST[4].GetValue()
>        FRA_SI = LIST[5].GetValue()
>        FRA_NO = LIST[6].GetValue()
>        B114_SI = LIST[7].GetValue()
>        B114_NO = LIST[8].GetValue()
>        LIMA_SI = LIST[9].GetValue()
>        LIMA_NO = LIST[10].GetValue()
>

Ora, in realtà, senza stare nemmeno a creare il dizionario, puoi avere 
subito il valore.

for Numeratore in range(0,Slot_To):
         MIX_NAME = 
getattr(parent,'nSLOT_SLOT_'+str(Numeratore).GetValue()
         JET_NAME = 
getattr(parent,'MISSION_NAME_SLOT_'+str(Numeratore).GetValue()
         JET_NUMBER = 
getattr(parent,'AIRCRAFT_NAME_SLOT_'+str(Numeratore).GetValue()
         .............
         ..............
         LIMA_NO = 
getattr(parent,'RADIO_LIMA_NO_SLOT_'+str(Numeratore).GetValue()

Con questo dovresti accedere tranquillamente. In pratica con la getattr 
hai la referenza dell'oggetto wx a partire dalla riga e dal nome e con 
GetValue ne prendi il valore.

Se vuoi essere più elegante.........:
Potresti, per eleganza, aggiungere all'oggetto una function 
getRowNamedValue

def getValueFromRow (self,row,name)
     return getattr(self,name+str(row).GetValue()

in tal modo il tuo codice diventa:

for Numeratore in range(0,Slot_To):
         MIX_NAME = parent.getValueFromRow(Numeratore,'nSLOT_SLOT_')
         JET_NAME = 
parent.getValueFromRow(Numeratore,'MISSION_NAME_SLOT_')
         JET_NUMBER = 
parent.getValueFromRow(Numeratore,'AIRCRAFT_NAME_SLOT_')
         .............
         ..............
         LIMA_NO 
=parent.getValueFromRow(Numeratore,'RADIO_LIMA_NO_SLOT_')

che è più elegante da vedere.

>
> e così recupero il valore di ognuno degli elementi che avevo nel form 
> di partenza.
>
> Ora dimmi se forse (come probabile), non ho capito io il tuo esempio 
> quindi come mi hai detto tu fa la stessa cosa e se è più performante 
> in termine di memoria, quindi in prestazioni.
>
> Se invece quello che vorrei io lo posso fare solo nel modo in cui l'ho 
> fatto già, oppure c'è un metodo migliore e più performante??
>
> Inoltre quando creo il form sono costretto a scrivere il codice per 
> intero oppure c'è un modo per fare si che le varie righe le posso 
> creare dinamicamente??  sinceramente ho incontrato problemi. Adesso 
> poi a parte che ci impiega circa due o tre secondi nella creazione, a 
> volte lo crea a scatti, da cosa può dipendere?? posso avere dei 
> problemi in futuro??
> Ciao e grazie ancora.... yuk!

Spero ti sia di aiuto. Come consiglio personale ti conviene esporre 
molto molto bene il problema perchè a te che scrivi è evidente ma chi 
ti legge non avendolo vissuto, magari fatica a capire.

Ciao
G.



More information about the Python mailing list