[Python] Dubbi organizzazione progetto
Y3s
y3s a katamail.com
Dom 25 Nov 2007 13:49:36 CET
Il giorno 25/nov/07, alle ore 13:28, Mr.SpOOn ha scritto:
> On Nov 25, 2007 12:41 PM, Y3s <y3s a katamail.com> wrote:
>> Cosa intendi con "passa per il rumore"?
>
> Eheh, ho cercato di evitare i dettagli per non dilungarmi troppo, ma
> forse ho solo fatto più confusione.
>
> Ho tre oggetti principali che ho voluto dividere in 3 staticbox:
> 1) Trasmittente: ha dei campi di testo e dei wxChoices e qualche
> bottone per confermare le varie operazioni. Si inserisce un testo,
> viene codificato in base a quanto specificato nei menu a tendina e fa
> partire il messaggio.
>
> 2) Rumore: il messaggio deve passare da qui. In questo box c'è
> semplicemente uno slider che definisce la quantità di rumore.
>
> 3) Ricevente: ci sono dei campi di testo nei quali apparirà il
> messaggio nuovamente decodificato.
Prima di tutto, ti consiglio di dividere la logica applicativa
dall'interfaccia utente, e di non confondere le due cose. Per
applicazioni semplici spesso non c'è bisogno di ricorrere a modelli
tipo MVC, ma è comunque importante separare la logica applicativa
dalla GUI.
>> Non ho ben capito la tua esigenza e il tuo dubbio :-)
>> Comunque, se ho capito bene, quello che ti serve è un tuo oggetto che
>> contiene una serie di widget, da poter istanziare "in un colpo solo"
>> e riutilizzare, giusto?
>> Se è così, crei una classe derivata da
>> wx.Panel, nel suo __init__ costruisci i suoi figli (quindi staticbox,
>> sliders & company), e poi te lo dimentichi (nel senso che ogni volta
>> che ti serve devi solo fare un mio_panel = MioPanel
>> (self.panel, ..parametri..))
>
> Sì, su questo più o meno ci sono. Il problema ce l'ho negli elementi
> più interni.
> Ad esempio per il rumore non avevo fatto una classe separata, ma
> semplicemente un metodo che generasse qualcosa di casuale basandosi
> sul valore dello slider. Il fatto è che dovrebbe leggere questo valore
> da qualche parte e mi sembra che l'unica soluzione sia:
Secondo me stai mischiando l'interfaccia a quello che il programma
deve effettivamente fare.
> - o l'utilizzo di una variabile globale
> - o creare una classe rumore con i propri event handler etc.
>
> Sbaglio o la soluzione è più semplice di quanto non la stia facendo
> io?
> Considerate le due scelte, mi sembrava che una classe apposita fosse
> meglio. In questo modo avrei fatto anche una classe Trasmittente e una
> Ricevente, ognuna con i propri metodi etc.
Fermo restando quanto ho scritto sopra, io procederei così:
- Da qualche parte c'è una funzione (o un metodo di una classe) che
esegue effettivamente il lavoro, prendendo in ingresso i parametri di
cui necessita (o prendendoli dallo stato dell'oggetto a cui
appartiene, se è un metodo)
- Avrai un pulsante in quello che tu chiami "Trasmittente" (o
comunque qualcosa da attivare per far si che il lavoro sia eseguito).
Quando viene premuto questo pulsante (o quello che è), vengono
raccolti tutti i dati dall'interfaccia (incluso il valore del
"rumore") e viene chiamata la funzione di cui sopra, utilizzando tali
parametri. La funzione restituisce il/i valori, i quali vengono poi
inseriti nei campi di quello che tu chiami "Ricevente". Naturalmente
se c'è bisogno di mantenere stato puoi anche utilizzare un oggetto al
posto della funzione e leggerne lo stato piuttosto che utilizzare il
valore di ritorno della funzione, questi sono dettagli che valuterai tu.
> Prendendo per buona questa decisione, non capisco bene come creare
> queste classi. Ho pensato che dovessero essere sottoclassi di
> StaticBox, tipo così:
Lo staticbox è semplicemente quel piccolo "bordino", in genere va
utilizzato così com'è. A te serve un container, devi ereditare da
wx.Panel.
> class Trasmittente(wx.StaticBox):
> def __init__(self.panel, -1, "Trasmittente"):
> ...
> ...
>
> Lo stesso farei per Rumore e Ricevente.
> Il punto è che non ho capito bene la relazione fra gli StaticBox e gli
> StaticBoxerSizer. Seguendo l'esempio del libro l'interfaccia l'ho
> creata correttamente, a adesso mi blocco invece. Forse Trasmittente
> dovrebbe essere sottoclasse di StaticBoxSizer?
Lo staticboxsizer non è altro che un boxsizer che gestisce
automaticamente uno staticbox. Un sizer è un oggetto che gestisce il
posizionamento e il dimensionamento degli elementi in un container in
modo prestabilito. Il BoxSizer in particolare posiziona tutti gli
oggetti che gestisce uno dopo l'altro, in orizzontale o in verticale.
Uno StaticBoxSizer è esattamente uguale a un normale BoxSizer, solo
che ti permette di associargli uno staticbox, per cui vedi il bordino
arrotondato intorno..è un oggetto puramente estetico. Quello che a te
serve è solo un Panel a cui vai ad associare il sizer che più ti
conviene.
> Spero di essere stato un po' più chiaro stavolta :\
>
>
> grazie ancora, ciao :D
Spero di aver risposto alla tua domanda :-)
--
Antonio Valente
More information about the Python
mailing list