Mah sai, non avrai modo di creare oggetti con nomi diversi in un loop, ma hai comunque modo di inserire dinamicamente dentro un dizionario (o qualcosa del genere) dei riferimenti a questi oggetti. In python queste cose sono un gioco da ragazzi.
Per esempio, lasciando fuori per un attimo il discorso gui, immagina di avere una classe qualsiasi, per esempio
[codice]
class Entry(object):
pass
[/codice]
se decidi per esempio di crearne un tot e metterli in una struttura a griglia, potresti usare una lista di liste per contenere i riferimenti agli oggetti che crei:
[codice]
def fai_una_griglia_di_entry(num_righe, num_colonne): # rozzo ma chiaro
griglia = []
for i in range(1, len(num_righe)):
riga = []
for j in range(1, len(num_colonne)):
e = Entry()
riga.append(e)
griglia.append(riga)
return griglia
[/codice]
Ora, se fai girare questa funzione (per esempio griglia = fai_una_griglia_di_entry(4, 6), ti restituisce un gruppo di Entry "anonime". E' vero che nessuna di loro puoi "chiamarla per nome" con una variabile, ma puoi comunque riferirti a ciascuna Entry attraverso gli indici della griglia: griglia[2][4] e così via.
Ficcare tutto in un dizionario è ancora più semplice (basta ricordare che le tuple vanno bene come chiavi di dizionario, e sperare che il tuo oggetto Entry sia hashabile, cosa che di solito è):
[codice]
def fai_un_dizionario_di_entry(num_righe, num_colonne): # rozzo ma chiaro
dizionario = {}
for i in range(1, len(num_righe)):
for j in range(1, len(num_colonne)):
dizionario[(i, j)] = Entry()
return dizionario
[/codice]
Ora venendo al discorso gui, io non sono pratico di tk e magari la logica di impacchettamento è diversa, quindi ti faccio l'esempio con le wx (ma è talmente ovvio da seguire che non devi conoscere le wx per capirlo).
Nelle wx potresti facilmente scrivere una factory come
[codice]
def make_entry_grid(rows, cols, parent=None): #"parent" è la finestra dove vanno messi
d = {}
p = wx.Panel(parent) # uno "sfondo" di appoggio
s = wx.GridSizer(rows, cols) # un sizer per incolonnare fisicamente le entry
for i in range(1, len(rows)):
for j in range(1, len(cols)):
e = wx.TextCtrl(p, -1, 'hello') # creo una entry
s.Add(e) # impacchetto la entry nel sizer
d[(i, j)] = e
p.SetSizer(s) # attacco il sizer con le entry allo sfondo
return d, p
[/codice]
Quando esegui questa funzione (per esempio self.entries, self.panel_entries = make_entry_grid(5, 4, self), restituisce due cose: il panel "contenitore" con tutte le entry già disegnate, che potrai a tua volta appiccicare da qualche parte nella tua finestra; e un dizionario pieno di riferimenti alle singole entry che hai creato.
Così potrai fare cose come self.entries[(2,3)].SetValue('foo') oppure self.entries[(2, 2)].GetValue() eccetera.
Ora, con le tk non dovrebbe essere difficile fare qualcosa del genere.
Per quanto riguarda la distruzione / ricreazione in seguito della griglia... non saprei, io consiglio sempre di NON mettersi a fare queste cose, per l'utente sono molto disturbanti. Comunque, nell'esempio di cui sopra, a questo punto sarebbe facile distruggere semplicemente tutto il panel contenitore, e chiamare daccapo la funzione per crearne un altro, e ri-appiccicarlo al suo posto nel layout della finestra. Come fare esattamente queste operazioni dipende dall'api del tuo framework (saprei farlo facilmente con le wx, dovrei studiarci un attimo per le tk).