venerdì 4 gennaio 2013

La mia ButtonBar

Oggi vediamo di usare le cose che abbiamo visto nel post precedente. Secondo voi sarebbe possibile fare qualcosa come in figura, cioè la toolbar visibile sulla destra in alto che fa tutta quella roba?

Sembra che sia lanciata dal terminale parzialmente visibile a sinistra in basso. Uhm... che dite ci proviamo? Dai, non è difficile.

Solo un paio di avvertenze prima di partire.
1) Viene usato xdg-open; provate a digitare questo comando nel terminale. Dovrebbe esserci, in caso contrario mettete un commento.
2) Naturalmente funziona solo per Linux; esiste l'equivalente per Windows, se volete prossimamente ...
3) Io uso Firefox e Gedit, se usate di default un altro browser e editor per i testi naturalmente userà quelli.
4) Se da terminale do il comando xdg-open img.png e questa immagine esiste me la apre; se voglio aprirla in Gimp (sempre che sia installato) invece dovrò dare gimp img.png. Questo per chi volesse introdurre nuovi pulsanti nella ButtonBar.

OK, un'ultima cosa: ci servono le immagini per i pulsanti. Attenzione che devono avere tutte la stessa dimensione.

Dovete inserire:
  • about.png
  • atr.png
  •  exit.png
  • goo.png
  • memo.png
  • okp.png
  • tsou.png

Bene, ecco il codice per bb.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import wx, sys, os

posx = 777 #posizione finestra
posy = 25
tit = ''

def get_data():
    global bcap, bico, bcmd

    bcap = ['The Secrets of Ubuntu', 'Al Tamburo Riparato', 
            'OK, panico', 'Google', 'memo', 'about', 'exit']
    bico = ['tsou.png', 'atr.png', 'okp.png', 'goo.png', 
            'memo.png', 'about.png', 'exit.png']
    bcmd = ['http://parliamodi-ubuntu.blogspot.it',
            'http://tamburoriparato.blogspot.it',
            'http://okpanico.wordpress.com',
            'http://google.com',
            '*~/memo.txt',
            '*about',
            '*exit']
             
    nele = len(bcap) 
    return nele

def open_memo(nome):    
    #print nome
    nome = os.path.expanduser(nome)
    # se si usa una variabile come $HOME mettere
    # expandvars al posto di expanduser
    #print nome
    ex = os.path.isfile(nome)
    #print ex
    if not ex:
        f = open(nome, 'w')
        f.close()
        ex = os.path.isfile(nome)
        #print ex
        if not ex:
            msg = 'impossibile creare\n{0}'.format(nome)
            wx.MessageBox(msg, 'Errore') 
            return()
    os.system('xdg-open ' + nome)
    
class BBar(wx.Frame):
    global bcap, bico, bcmd, nele

    tit = 'la mia ButtonBar'
    nele = get_data()

    def __init__(self, parent, id, title):
        global nele, tit, bcmd, bico, bcap

        vert = True # cambiare se si vuole orizzontale
        stile = wx.FRAME_NO_TASKBAR
        wx.Frame.__init__(self, parent, id, title = tit, style = stile)

        if vert:
            self.toolbar = self.CreateToolBar(wx.TB_VERTICAL)
        else:
            self.toolbar = self.CreateToolBar()
        
        for c in range(nele):
            t = bico[c]
            cap = bcap[c]
            self.toolbar.AddLabelTool(c, '', wx.Bitmap(t), shortHelp = cap)
        
        self.SetSize(self.toolbar.GetSize())
        self.toolbar.Realize()
        
        for c in range(nele):
            self.Bind(wx.EVT_TOOL, self.OnClick, id = c)
        self.SetPosition(wx.Point(posx, posy))
        self.Show(True)
        
    def OnClick(self, event):
        ele = event.GetId()
        #print ele
        #print bcap[ele]
        #print bico[ele]
        #print bcmd[ele]

        cmd = bcmd[ele]
        # casi speciali, bcmd inizia con *
        if cmd[0] == '*':
            cmd = cmd[1:] #tolgo *
            #print '***************', cmd
            if 'memo' in cmd:
                open_memo(cmd) #devo verificare se c'è
            elif cmd == 'about':
                msg = '{0}\n{1}\n{2}\n{3}'.format(
                      'The Secrets of Ubuntu', 
                      'di tutto di più',
                      'by Bit3Lux & Juhan',
                      'v. 0.0')
                wx.MessageBox(msg, 'La mia ButtonBar') 
            elif cmd == 'exit':
                sys.exit(0)
        else: # cmd normale, senza * iniziale
            os.system('xdg-open ' + cmd)

#main
app = wx.App()
BBar(None, -1, '')
app.MainLoop()
Come vedete ho lasciato (come commenti) i print usati in fase di costruzione per chi volesse ravanarci su.
E poi visto com'è semplice? tutto si riduce a creare un frame con stile
wx.FRAME_NO_TASKBAR all'interno del quale mettere una toolbar. Popolo la toolbar con i pulsanti e la finestra è fatta.
A ogni pulsante assegno un id che userò nel metodo OnClick() per identificarlo. A questo punto non resta che usare os.system(), tranne nei casi particolari, quelli in cui bcmd inizia con *.

"Elementare Watson!", direbbe il mio amico Sherlock. Vero? O no?

L'ormai mitico Juhan!

Vi ricordo, come al solito, che esiste anche l'indice di "Mission Python"

Alla prossima!!!

Nessun commento:

Posta un commento