Un menu personalizzato e guai con un lanciatore.

È da tanto che non parlo di PythonwxPython 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.

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • Dikiyvolk  Il 12 marzo 2012 alle 21:54

    Ciao Juhan,

    Sulla seconda, il mio traduttore personale mi dice che è “Schiaccianoci” in russo e si pronuncia “Schelcunchik”.

    • juhan  Il 13 marzo 2012 alle 06:55

      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.

  • al3hex  Il 18 marzo 2012 alle 23:40

    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

    • juhan  Il 19 marzo 2012 alle 07:11

      Meraviglioso! Adesso dovrò raccontare tutto, per me che sono lento a capire. Certo che se invece volessi farlo te…

Trackback

  • Python, la grafica da un quiz « Ok, panico su 3 aprile 2012 alle 12:12

    […] 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 […]

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: