[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