[Gruppo FCM] FCM 32 - How-to - Programmare in Python - Parte 6

Giuseppe Calà jiveaxe a gmail.com
Ven 12 Feb 2010 12:22:38 GMT


HOW-TO Programmare in Python - Parte 6
Scritto da Greg Walters

Spero che abbiate sperimentato Boa Constructor dal nostro ultimo incontro. Cominceremo con un programma molto semplice che mostrerà un frame, quindi aggiungeremo un pulsante per mostrarne un secondo. L'altra volta creammo un box messaggio. Questa volta creeremo un frame completamente a parte. Questa procedura è utile per i programmi con molti frame o finestre. Quindi... cominciamo...


Avviate Boa Constructor e chiudete tutte le linguette della finestra Editor ad eccezione di Shell ed Esploratore usando la combinazione Ctrl-W. Questo ci assicurerà di partire da zero. Ora create un nuovo progetto cliccando sul pulsante wx.App (rivedete il precedente articolo se necessario).

Prima di procedere oltre, salvate Frame1 come "FrameMain.py" e App1 come "Gui2.py". Passaggio importante. Con la linguetta Gui2 selezionata nella finestra Editor, ritornare alla linguetta Nuovo della finestra Strumenti e aggiungere un altro frame al nostro progetto cliccando su wx.Frame (che si trova a fianco di wx.App). Assicurarsi che la linguetta Applicazioni mostri entrambi i frame sotto la colonna Modulo. Ora ritornate al nuovo frame e salvatelo come "FrameSecond.py":

Ora aprite FrameMain nel designer. Aggiungete un wx.Panel. Aggiustatelo affinché il pannello copri il frame. Quindi cambiamo alcune proprietà - non l'abbiamo fatto l'ultima volta. Nella finestra Ispezionatore, assicurarsi che la linguetta Constr sia selezionata e impostare Title a "Main Frame" e Name a "FrameMain". Parleremo in seguito di convenzioni per i nomi. Impostate la dimensione a 400x340 cliccando il check box Size. Verranno così mostrati high (altezza) e width (larghezza). Altezza dovrebbe essere 400 e larghezza 340:

Ora cliccate sulla linguetta Props. Cliccate sulla proprietà Centered e settatela a wx.BOTH. Cliccate il pulsante Invia e salvate il vostro lavoro. Eseguite l'applicazione cliccando sul pulsante con la freccia gialla. Il nostro programma comparirà al centro dello schermo con il titolo "Main Frame". Ora chiudetelo cliccando sulla "X" nell'angolo in alto a destra.

Richiamate il designer di FrameMain. Aggiungete due wx.Buttons, uno sopra l'altro e vicini al centro del frame. Selezionate quello superiore, chiamatelo "btnShowNew", e impostate la label a "Show the other frame" nella linguetta Constr della finestra Ispezionatore. Usate la combinazione Shift+Frecce per ridimensionare il pulsante così da rendere completamente visibile il testo, quindi usate la combinazione Ctrl+Frecce per muoverlo nuovamente al centro del frame. Selezionate il bottone inferiore, come Name usate "btnExit" e come label "Exit". Cliccate Invia, salvate ed eseguite per controllare i cambiamenti. Terminate il programma e ritornate al designer. È il momento di aggiungere gli eventi ai bottoni. Selezionate quello superiore e nel frame Ispezionatore selezionate la linguetta Evts. Cliccate su ButtonEvent, quindi doppio click su wx.Evt_BUTTON. Notate che dovreste vedere "OnBtnShowNewButton" in basso. Successivamente, selezionate il pulsante btnExit. Fate la stessa cosa, assicurandovi che sia mostrato "OnBtnExitButton". Ancora click su Invia e salvate. Quindi andate nella finestra Editor e scorrete verso il basso.

Assicuratevi che vi siano i due eventi appena creati. Ecco come dovrebbe apparire il frame:

Ora dobbiamo occuparci dell'altro frame. Aprite FrameSecond nel designer.

Impostate Name a "FrameSecond", e Title a "Second Frame". Impostare Centered a wx.BOTH. Aggiungete un wx.Button, allineandolo in basso al centro. Come Name inserire "btnFSExit" e cambiate il Title in "Exit". Impostate un evento. Quindi aggiungete un wx.StaticText nel mezzo della parte superiore del frame. Per Name mettete "stHiThere", per label "Hi there...I'm the second form!", e impostate il carattere a Sans, 14 punti e come weight mettete wxBOLD. Ora reimpostate la posizione in modo che sia centrato. Potete farlo deselezionando l'attributo Position e usare X per spostarlo a destra-sinistra e Y per spostarlo su-giù fino a quando non sarete soddisfatti. Click su Invia e salvate:

Ora che abbiamo realizzato i nostri form, creeremo la "colla" che terrà tutto assieme.

Nella finestra Editor, cliccate sulla linguetta Gui2, quindi, al di sotto, cliccate sulla linguetta Sorgente. Sotto la riga che dice "import FrameMain", aggiungere "import FrameSecond". Salvate. Successivamente, selezionate la linguetta "FrameMain". Sotto la riga "import wx", aggiungete "import FrameSecond". Quindi scorrete in basso fino a trovare la riga con "def __init__(self, parent):". Aggiungete una riga dopo "self._init_ctrls(parent)" con scritto "self.Fs = FrameSecond.FrameSecond(self )". Ora sotto l'evento "def OnBtnShowNewButton(self, event):", commentate "event.Skip()" e aggiungete le seguenti due righe:


self.Fs.Show()
self.Hide()

Per finire, sotto il metodo "OnBtnExitButton", commentate "event.Skip()", e aggiungete la riga "self.Close()".

A cosa serve tutto ciò? Ok. La prima cosa che abbiamo fatto e assicurarci che l'applicazione sappia di avere due form. Ecco perché abbiamo importato sia FrameMain che FrameSecond in Gui2. Quindi abbiamo importato un riferimento per FrameSecond in FrameMain così da poterlo chiamare dopo. Lo abbiamo inizializzato nel metodo "_init_". E nell'evento "OnBtnShowNewButton" abbiamo specificato che quando il pulsante viene cliccato, vogliamo mostrare il secondo frame e nascondere quello principale. Quindi abbiamo l'istruzione per chiudere l'applicazione quando si clicca su Exit.


Ora, passiamo al codice di FrameSecond. Qui le modifiche sono poche. Sotto il metodo "_init_", aggiungiamo la riga "self.parent =parent" che aggiunge la variabile self.parent. Infine, sotto l'evento di FSExitButton, commentate la riga "event.Skip()", e aggiungete queste due:

self.parent.Show()
self.Hide()

Ricordate che nascondiamo il frame principale quando mostriamo il secondo, per poi mostrarlo nuovamente dopo aver nascosto il secondo. Salvate.

Ecco il codice per verificare quanto fatto (questa e la pagina successiva):

Ora potete eseguire l'applicazione. Se tutto è esatto, cliccando su "Show the other frame" vedremo il primo frame scomparire e apparire il secondo. Cliccando sul bottone Exit del secondo frame questo scomparirà e ricomparirà quello principale. Cliccate sul pulsante Exit del frame principale per chiudere l'applicazione.

Vi avevo promesso che avremmo parlato di convenzioni per i nomi. Ricordate quando parlammo di commenti al codice? Bene, scegliere con cura i nomi per i controlli della gui è già un primo passo. È molto importante scegliere nomi significativi quando create frame complessi con molti controlli, specialmente se ci sono molti box di testo e pulsanti, invece di lasciare staticText1 o button1 o altro. Potrebbe non esserlo se sarete gli unici a controllare il codice, ma un altro programmatore troverebbe giovamento da nomi ben scelti. Quindi, usate qualcosa di simile ai seguenti:



Tipo controllo - Prefisso nome
Static text    - st_
Button         - btn_
Text Box       - txt_
Check Box      - chk_
Radio Button   - rb_
Frame          - Frm_ or Frame_

Potrete usare altri sistemi man mano che diventerete esperti, e in certi casi il vostro capo potrebbe già avere delle convenzioni proprie.


La prossima volta metteremo da parte la programmazione di GUI e ci concentreremo sui database. Nel frattempo, procuratevi python-apsw e python-mysqldb. Avrete anche bisogno di sqlite e sqlitebrowser per SQLite. È una buona idea sperimentare anche con MySql. Sono tutti disponibili via Synaptic.

Greg Walter è il proprietario della RainyDay Solutions, LLC, una società di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.


Codice Gui2:


#!/usr/bin/env python
#Boa:App:BoaApp


import wx


import FrameMain
import FrameSecond


modules ={u'FrameMain': [1, 'Main frame of Application', u'FrameMain.py'], u'FrameSecond': [0, '', u'FrameSecond.py']}


class BoaApp(wx.App):
    def OnInit(self):
        self.main = FrameMain.create(None)
        self.main.Show()
        self.SetTopWindow(self.main)
        return True


def main():
    application = BoaApp(0)
    application.MainLoop()


if __name__ == '__main__':
    main()



Codice FrameMain:


#Boa:Frame:FrameMain


import wx
import FrameSecond


def create(parent):
    return FrameMain(parent)


[wxID_FRAMEMAIN, wxID_FRAMEMAINBTNEXIT, wxID_FRAMEMAINBTNSHOWNEW, wxID_FRAMEMAINPANEL1,] = [wx.NewId() for _init_ctrls in range(4)]


class FrameMain(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAMEMAIN, name=u'FrameMain', parent=prnt, pos=wx.Point(846, 177), size=wx.Size(400, 340), style=wx.DEFAULT_FRAME_STYLE, title=u'MainFrame')
        self.SetClientSize(wx.Size(400, 340))
        self.Center(wx.BOTH)
        self.panel1 = wx.Panel(id=wxID_FRAMEMAINPANEL1,name='panel1', parent=self, pos=wx.Point(0, 0), size=wx.Size(400, 340), style=wx.TAB_TRAVERSAL)
        self.btnShowNew = wx.Button(id=wxID_FRAMEMAINBTNSHOWNEW, label=u'Show the other frame', name=u'btnShowNew', parent=self.panel1, pos=wx.Point(120, 103), size=wx.Size(168, 29), style=0)
        self.btnShowNew.SetBackgroundColour(wx.Colour(25, 175, 23))
        self.btnShowNew.Bind(wx.EVT_BUTTON, self.OnBtnShowNewButton, id=wxID_FRAMEMAINBTNSHOWNEW)



Codice FrameMain (cont.):


        self.btnExit = wx.Button(id=wxID_FRAMEMAINBTNEXIT, label=u'Exit', name=u'btnExit', parent=self.panel1, pos=wx.Point(162, 191), size=wx.Size(85, 29), style=0)
        self.btnExit.SetBackgroundColour(wx.Colour(225, 218, 91))
        self.btnExit.Bind(wx.EVT_BUTTON, self.OnBtnExitButton, id=wxID_FRAMEMAINBTNEXIT)


    def __init__(self, parent):
        self._init_ctrls(parent)
        self.Fs = FrameSecond.FrameSecond(self)


    def OnBtnShowNewButton(self, event):
        #event.Skip()
        self.Fs.Show()
        self.Hide()


    def OnBtnExitButton(self, event):
        #event.Skip()
        self.Close()



Codice FrameSecond:


#Boa:Frame:FrameSecond


import wx


def create(parent):
    return FrameSecond(parent)


[wxID_FRAMESECOND, wxID_FRAMESECONDBTNFSEXIT, wxID_FRAMESECONDPANEL1, wxID_FRAMESECONDSTATICTEXT1,] = [wx.NewId() for _init_ctrls in range(4)]


class FrameSecond(wx.Frame):
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Frame.__init__(self, id=wxID_FRAMESECOND, name=u'FrameSecond', parent=prnt, pos=wx.Point(849, 457), size=wx.Size(419, 236), style=wx.DEFAULT_FRAME_STYLE, title=u'SecondFrame')
        self.SetClientSize(wx.Size(419, 236))
        self.Center(wx.BOTH)
        self.SetBackgroundStyle(wx.BG_STYLE_COLOUR)
        self.panel1 = wx.Panel(id=wxID_FRAMESECONDPANEL1, name='panel1', parent=self, pos=wx.Point(0, 0), size=wx.Size(419, 236), style=wx.TAB_TRAVERSAL)
        self.btnFSExit = wx.Button(id=wxID_FRAMESECONDBTNFSEXIT, label=u'Exit', name=u'btnFSExit', parent=self.panel1, pos=wx.Point(174, 180), size=wx.Size(85, 29), style=0)
        self.btnFSExit.Bind(wx.EVT_BUTTON, self.OnBtnFSExitButton, id=wxID_FRAMESECONDBTNFSEXIT)
        self.staticText1 = wx.StaticText(id=wxID_FRAMESECONDSTATICTEXT1, label=u"Hi there...I'm the second form!", name='staticText1', parent=self.panel1, pos=wx.Point(45, 49), size=wx.Size(336, 23), style=0)
        self.staticText1.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD, False, u'Sans'))


    def __init__(self, parent):
        self._init_ctrls(parent)
        self.parent = parent


    def OnBtnFSExitButton(self, event):
        #event.Skip()
        self.parent.Show()
        self.Hide()


==================================================================


VIGNETTE A PAGINA 12

Titolo: Un vero amico

- Non preoccuparti, il mondo è pieno di ragazze carine.

- Sono sicuro che molte di loro farebbero sesso con te.

- Sebbene potrebbe non essere economico.

di Richard Redei


Titolo: L'intervista

- È facile. Immagina semplicemente di parlare con me.

- Così sarai più sciolto. Ora cosa diresti?

* Non dimenticare la birra.

- Credo che dovremo lavorarci su.

di Richard Redei


-- 
Giuseppe Calà
OpenPGP key: 0x749487B5
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://liste.ubuntu-it.org/pipermail/ubuntu-it-fcm/attachments/20100212/def79ff5/attachment-0001.htm>
-------------- parte successiva --------------
Un allegato non testuale è stato rimosso....
Nome:        non disponibile
Tipo:        application/pgp-signature
Dimensione:  198 bytes
Descrizione: This is a digitally signed message part.
URL:         <http://liste.ubuntu-it.org/pipermail/ubuntu-it-fcm/attachments/20100212/def79ff5/attachment-0001.pgp>


Maggiori informazioni sulla lista ubuntu-it-fcm