[PIPython] Costruzione e recupero dinamici

Massimo Cecconi massimo.cecconi
Gio 31 Mar 2005 17:52:34 CEST


Si in effetti è proprio quello che mi occorre :)  se non fosse altro 
però che in un simil modo non così "pythonoso" però :):)  ci avevo 
provato pure io ed infatti non va perchè mi restituisce questo errore:

'str' object has no attribute 'GetValue'

se uso questo:
for Numeratore in range(0,Slot_To):
        MIX_NAME = getattr(parent,'nSLOT_SLOT_'+str(Numeratore).GetValue()
       .........
       .........


oppure se uso questo:

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

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


quindi come risolvo?? azz sto sclerando!!?? uff....

Quando mi dici:

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.


Hai assolutamente ragione ma è riferito all'altro mio dubbio?? cioè la 
creazione del form vero?? oppure a cosa :(


Grazie ancora per la tua santa pazienza :):)


Giovanni Porcari ha scritto:

> 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.
>
> _______________________________________________
> La mailing list di python.it
> python a lists.python.it
> http://lists.python.it/cgi-bin/mailman/listinfo/python
>
>



More information about the Python mailing list