Intro a Python per Windows — 8: GUI -> wxPython

Lo so che sono passati 15 giorni dall’ultima lezione 😦 Ma nel frattempo ci sono stati disguidi e intoppi di vario genere. Per dire, la restituzione del router Alice è stata interpretata come disdetta della linea da Telecom!
E sono rimasto isolato dal mondo per 10 giorni 😦
E ho scoperto che senza il Web non si riesce più a fare niente 😦
E i brufoli psicosomatici peggiorano, al pari della situazione politica 😦
OK, la situazione politica non è collegata direttamente a Telecom ma è comunque pessima, gelminica, frattinica, stracquadanica quasi, è tutto un complotto contro di lui 😦

O no?

Venendo al dunque io per l’interfaccia grafica degli script Python uso wxPython di Robin Dunn. wx è scritta in C++ e parecchia documentazione è per il C++ ma con Python funziona benissimo ed è totalmente cross-platform, lo stesso codice funziona su Linux, Windows e (non l’ho provato) su Mac. A dire il vero quando si definiscono le dimensioni della finestra in Windows bisogna calcolare anche la barra del titolo, con Linux no. Inoltre i pulsanti di sistema sulla barra stessa a volte fanno i capricci, ma sono quisquilie.

Installazione
Bisogna installare il package. Niente panico! è la cosa più semplice che ci sia. Basta andare all’URL http://wxpython.org/download.php e scaricare wxPython2.8-win32-unicode-py27 e il gioco è fatto.
A me è successo che dopo l’installazione il ‘puter fosse affaticato assai, con il fiatone e la bava alla bocca. È bastato riavviare e tutto è tornato OK. Già che ci siamo sulla stessa pagina c’è wxPython Demo for Windows che contiene tutti gli esempi di quello che uno potrebbe immaginarsi e anche di più. Da scaricare e installare anche se conviene partire da qualcosa più semplice, ricordate che Ankh Morpork non è stata costruita in un giorno.

Hello world!

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        global inp

        wx.Frame.__init__(self, parent, id, size = (120, 120),
                pos = (200, 200), title = "Hello world!")
                #style = wx.CAPTION | wx.CLOSE_BOX)

        self.pn = wx.Panel(id = 1, name='pn', parent = self)
        self.pn.SetBackgroundColour('yellow')

        self.label1 = wx.StaticText(self.pn,
							label = "il tuo nome", pos = (10, 8))
        inp = wx.TextCtrl(self.pn,
							size = wx.Size(100, -1), pos = (10, 25))

        self.button = wx.Button(self.pn, label="vai", pos = (10, 60),
                                            size = wx.Size(100, 24))
        self.button.Bind(wx.EVT_BUTTON, self.on_button)

    def on_button(self, event):
        global inp
        nome = inp.GetValue().strip()
        msg1 = 'benvenuto nel magico mondo di wx python'
        msg2 = 'e vedrai cosa ti aspetta in futuro!'
        wx.MessageBox('ciao %s!\n%s\n%s' %(nome, msg1, msg2), 'ciao!')
        self.pn.SetBackgroundColour('pink')

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = MyApp()
app.MainLoop()

Ecco lo script per assaggiare wx. Semplice vero?
Alla riga 4 diciamo di usare wx, e passiamo a definire un frame, righe 6-32.
All’interno del frame, nel metodo __init__ inseriamo un pannello (pn) di colore giallo sul quale inseriamo una label (etichetta, scritta), un’area in cui inserire il testo (text control) chiamata inp. Siccome dovremo recuperare il testo inserito inp viene dichiarata globale, sia nel metodo in cui viene creata, riga 8, che nella funzione in cui viene usata (riga 27).
Mettiamo poi un pulsante (button) e indichiamo il nome del metodo cui deve rispondere, metodo definito alle righe 26-32.

A questo punto inglobiamo la classe MyFrame in MyApp che semplicemente visualizza l’istanza frame. Ecco sono riuscito a descrivere il tutto rendendolo complicatissimo, e manco anche di fantasia per i nomi delle variabili: in realtà è molto più semplice.

Se apriamo Esplora risorse/Explorer nella cartella in cui c’è lo script e facciamo doppio click otteniamo

Ci sarebbe ancora da fare qualche ritocco: 1) non voglio la finestra del prompt dei comandi, 2) la riga 32 non funziona, o meglio funziona per il resto della finestra, provate a renderla a pieno schermo. Per 1) si può applicare quanto appreso la volta scorsa, forse…, prossimamente…

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: