È da tanto che non parlo di Python, wxPython e AWG. Chissà se li ricordo ancora? O devo ristudiarli da capo un’altra volta ![]()
No, dai! li ho usati recentemente e oggi voglio montare un applicazioncella che mi faciliti il lancio dei documenti audio che tengo in sottofondo quando lavoro, se posso e non disturbo. Quello che voglio ottenere è questo

Avevo già fatto un qualcosa di simile, il 3 gennaio 2011, lo trovate su questo blog, qui: oook – gestore documenti.
Poi recentemente ne ho preparato uno simile, per altre cose e mi è venuta l’idea di usarlo per la musica.
Facendo riferimento all’immagine vediamo che abbiamo tanti pulsanti ognuno dei quali con il nome di un cantante o compositore o gruppo. Rappresentano directory (o link a directory) contenenti i file audio.
Credo che la cosa migliore sia di visualizzare subito il listato, eccolo
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys, wx
import wx.lib.agw.aquabutton as AB
BOFFS = 101 # offset id bottoni
def getmoodirs():
global homedir, moodir
homedir = os.path.abspath(os.path.dirname(sys.argv[0]))
moodir = os.path.join(homedir, 'moo')
def makemoo():
global moodir, objlst
nostart = ['.', 'no-list']
objlst = sorted(os.listdir(moodir), key = str.lower)
if len(objlst) == 0:
return False
oklist =[] #start
for ele in objlst:
no = False
for c in nostart:
no = ele[:len(c)] == c
if no: break
if not no:
oklist.append(ele)
if len(oklist) == 0:
return False
if len(objlst) > 20:
objlst = objlst[:20]
return True
class mooFrame(wx.Frame):
def __init__(self):
global homedir, moodir
global objlst
tit = os.path.basename(homedir)
stile = wx.SYSTEM_MENU | \
wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | \
wx.FULL_REPAINT_ON_RESIZE
wx.Frame.__init__(self, None, -1, tit, style = stile)
self.SetIcon(wx.Icon(os.path.join(homedir, 'moo.png'), wx.BITMAP_TYPE_PNG))
self.pn = wx.Panel(id=1, name='pn', parent=self)
self.pn.SetBackgroundColour(wx.WHITE)
for c in range(len(objlst)):
txt = objlst[c]
if len(txt) > 32:
txt = txt[:31]
self.btn = AB.AquaButton(self.pn, -1, label = txt)
self.btn.SetId(BOFFS + c)
self.btn.SetPosition((5, 5 + 40 * c))
self.btn.SetBackgroundColour('black')
self.btn.SetForegroundColour('white')
self.btn.SetSize((240,50))
self.btn.Bind(wx.EVT_BUTTON, self.OnClick)
h = 10 + len(objlst) * 40
self.SetSize((240, h))
def OnClick(self, event):
global objlst, moodir
bid = event.GetId()
w = objlst[bid - BOFFS]
wp = os.path.join(moodir, w)
if os.path.isdir(wp):
os.system('totem "%s" &' %wp)
#main
getmoodirs()
if not makemoo():
sys.exit(2)
app = wx.PySimpleApp()
frame = mooFrame()
frame.Show()
app.MainLoop()
Ci sono un po’ di osservazioni da fare.
Il metacomando (o direttiva) # -*- coding: utf-8 -*- della riga 2 è importante per poter visualizzare le stringhe con caratteri accentati o esotici (come la ç di Françoise Hardy).
Il programma appena lanciato determina la directory in cui si trova, riga 9 e la subdirectory moo dove sono le cartelle contenenti i file audio. A questo punto crea la lista, riga 15, escludendo cartelle e file ‘non buoni’.
Abbiamo allora tutto per creare la classe mooFrame, riga 39. La finestra viene creata con le caratteristiche specificate (titolo, pulsanti di sistema, icona, colori di sfondo e primo piano). Il ciclo delle righe 52-62 inserisce i pulsanti con i dati della lista delle directory precedentemente rilevata. Abbiamo quindi la possibilità di calcolare l’altezza della finestra e settarla, righe 64 e 65.
Il comportamento di ogni pulsante è definito nelle righe 67-74 il cui metodo era stato indicato nella riga 62. Ed è una cosa semplicissima, riga 74, io uso totem, quello predefinito all’installazione ma se si utilizza qualcos’altro basta modificare la stringa. Notare come la variabile wp, contenete il nome della directory sia tra doppi apici, per i nomi con spazi.
Il file dello script l’ho chiamato moox, per renderlo eseguibile eseguo
chmod +x moox
in modo da poterlo lanciare con ./moox

Ma si può fare di più, creare un lanciatore: aprire l’editor (io uso gedit e creare il file L_moo.desktop, così
[Desktop Entry] Version=1.0 Type=Application Terminal=false Icon[it_IT]=/home/juhan/lab/moosic/moo.png Name[it_IT]=moosic Exec=/home/juhan/lab/moosic/moox Name=moosic Icon=/home/juhan/lab/moosic/moo.png
Saranno da cambiare i percorsi (path) di icona e exec, ovviamente. come icona io ho utilizzato quella in figura.
Salviamo il file e rendiamolo eseguibile con
chmod +x L_moo
magia! il file ha cambiato nome e icona. Con il doppio click lancia lo script ma a volte da problemi quando si tenta di chiuderlo. Non capita sempre, ho provato a googlare e ho scoperto che il problema è noto, ci sono tante ricette, nessuna che mi soddisfi. C’è però la promessa di Canonical di addressarlo quanto prima, forse
Resta un dubbio, come si scrive Chaikowsky? A quanto pare ognuno fa un po’ quello che vuole, io ho questo

ecco la prima riga è come si dovrebbe scrivere. Per sapere cosa c’è scritto sulla seconda la nostra unica speranza è Dikiyvolk
Aggiornamento: modificata la riga 74, adesso non dovrebbe più segnalare il messaggio d’errore. Grazie Pietro.

Commenti
Ciao Juhan,
Sulla seconda, il mio traduttore personale mi dice che è “Schiaccianoci” in russo e si pronuncia “Schelcunchik”.
Ringrazia la tua traduttrice personale; un saluto a lei e alla signorina Laura da parte mia
Sì, concordo se mettevo l’immagine di tutta la finestra compariva anche come titolo.
Per i più esigenti, ho effettuato un triplice porting dello script in Qt4, Gtk+-2 e Gtk+-3
* moox-qt4: http://pastebin.com/8pWav503
* moox-gtk2: http://pastebin.com/cK4k6a4w
* moox-gtk3: http://pastebin.com/EFqB6iWM
Meraviglioso! Adesso dovrò raccontare tutto, per me che sono lento a capire. Certo che se invece volessi farlo te…
Trackback
[...] 12 marzo ho pubblicato un post su Python e wxPython, lo trovate qui. La cosa più interessante del post è il commento di al3hex, preannunciata da un [...]