tutoral1

Prima di tutto occorre importare due classi: GnrModule per la scrittura del nostro modulo e GnrApplication per il main.

from gnr.wx.gnrwxapp import GnrModule,GnrApplication

Definiamo il modulo MyModule? che eredita da GnrModule. La prima cosa da definire è il modulename

class MyModule(GnrModule):
    modulename='helloworld'

Implementazione del metodo configure(). Viene aggiunto all'albero dei widgets un frame con il metodo frame() Il frame ha name= "example", title="Hello from GnrWx!" e la posizione della finestra viene impostata centrale pos="center"

    def configure(self):
        myframe=self.widgets.frame('example', title='Hello from GnrWx!', pos='center')

Questo semplice main non fa altro che instanziare una GnrApplication e caricare come unico modulo quello appena definito, poi invoca il comando run() che avvia l'applicazione.

if __name__ == '__main__':
    app=GnrApplication(modules=MyModule)
    app.run()

tutorial2

Suppioniamo ora di voler aggiungere alla nostra applicazione un menu nella menubar. Sarà sufficiente invocare il metodo menu() specificandone i parametri di configurazione e successivamente il metodo menuline() per ogni voce che si vuole aggiungere al menu.

def configure(self):
        myframe=self.widgets.frame('example', title='Hello from GnrWx!', pos='center')
        m1=myframe.menubar().menu('File')
        m1.menuline('About')
        m1.menuline('Exit')

Come si vede dal codice, al frame viene aggiunto una menubar e direttamente in cascata un menu, del quale è sufficiente specificare la label. Ad esso vengono attaccate le menuline, passando solamente il nome da mostrare. A questo punto bisogna implementare i metodi che gestiscono rispettivamente la selezione delle due menuline. Non avendo specificato col parametro handler un metodo in particolare, il sistema assume che il metodo gestore dell'evento legato alla voce del menu si chiami menu_ concatenato al nome della menuline minuscolo, quindi nel nostro caso dovremo implementare i metodi menu_about() e menu_exit()

    def menu_about(self):
        self.gui.message('This sample program shows \n frames, menus, statusbars, and this\n message dialog.',
                      title="About Me")
    
    def menu_exit(self):
        self.gui.alert('quit')

Il metodo menu_about() fa aprire un avviso invocando il metodo message() della classe GnrGui dall'attributo gui del modulo corrente. Al metodo message si passa come parametro la stringa del testo da mostrare ed il titolo del dialogue box. Il metodo menu_exit invece si comporta analogamente ma fa comparire un altro tipo di dialogue box, chiamato alert.

tutorial3

Vogliamo ora aggiungere un contenuto al nostro frame. Proviamo ad aggiungere un testo statico ed un bottone. Modifichiamo allora il metodo configure()

    def configure(self):
        myframe=self.widgets.frame('example', title='Hello from GnrWx!', pos='center', size ='auto')
        v=myframe.vsizer()
        v.statictext('Hello world!!', font='32')
        v.button('Click here', action='pressedButton')
        
        self.conf_menu(myframe)

Innanzitutto abbiamo aggiunto alla creazione del frame un parametro size= "auto", questo significa che la finestra avrà la minima dimensione rispetto al suo contenuto. Poi siccome ho bisogno di mettere il bottone sotto al testo, creo un sizer verticale con la chiamata del metodo visizer(). Al visizer attaggiungo il testo, generato da statictext(). Al metodo statictext() decido di passare solo la stringa col testo da mostrare e il parametro font con valore "32", che sarà il la dimensione della scritta. Poi creo il bottone col metodo button() passando come argomenti solo la label del bottone e la action che corrisponde alla pressione del bottone, ovvero al nome del metodo che gestirà questo evento. Infine si chiama il metodo conf_menu(), definito solo per mantenere separata la parte di configurazione riguardante i menu.

Ora per rendere funzionante il bottone occorre implementare il metodo che abbiamo chiamato pressedButton()

    def pressedButton(self):
        self.gui.alert('Hello, button clicker!')

Analogamente ai metodi già visti precedentemente, questo metodo fa comparire un alert box, con un testo.

tutorial3

Adesso vogliamo invece rendere che la nostra applicazione sia una piccola form. Quindi inserisco nel frame una etichetta, un campo ed un bottone di invio.

        mysizer=myframe.hsizer(defaultborder='all:20')
        mysizer.statictext('Name:')
        mysizer.field(id='name_field', len=20, value='type your first name', font='10,italic')
        mysizer.button('mybutton',label='submit', action='pressedButton')

Per mettere affiancati etichetta, campo e bottone definiamo un sizer orizzontale col metodo hsizer() con il parametro defaultborder= "all:20" che imposta fra tutti gli oggetti una spaziatura di 20 pixels. Il campo viene aggiunto col metodo field al quale passiamo un parametro id che identificherà il widget all'interno del modulo, un parametro len che imposta la lunghezza del campo, un parametro value che contiene la stringa inizialmente contenuta nel campo ed infine font nel qual specifico tutti i dati relativi alla visualizzazione della scritta, ovvero dimenzione e stile.

Supponiamo di voler aggiungere ora un menu popup contestuale alla applicazione. Per fare questo basta aggiungere il parametro popupmenu che assume come valore una stringa separata da virgole che rappresenta l'elenco delle voci del menu come coppie label : handler.

myframe=self.widgets.frame('example', title='Simple Form', pos='center',
                                              size='auto', popupmenu='save as xml:saveAsXml, quit:quit')