Python per tutti — memos

Il corso per gli utenti Windows, almeno per quanto riguarda Python, si può dire concluso: ormai chi ha seguito sa tutto quello che so io. In futuro ci sarà la presentazione di un altro linguaggio, con un approccio e una storia molto diversa ma ancora più eccitante.
Forse 🙂

Oggi un piccolo script che io uso e per l’occasione l’ho riscritto con l’obiettivo che fosse perfettamente identico su Windows e Linux (almeno Ubuntu; credo ci voglia qualche aggiustatina per Kubuntu/KDE).
Fa una cosa molto semplice: io che sono disordinato e smemorato quando mi viene un’idea (a volte succede) mi segno un appunto su quello che mi capita a tiro, che poi perdo o non ricordo dove l’ho messo. Ma adesso non più: ci sono alcuni file di testo sul ‘puter apposta per segnare questi memo/appunti. Lo script che segue facilita l’accesso a questi file.

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

import os, sys, platform, wx

flist = [] #lista dei memo
OS = platform.system() #Linux | Windows
BOFS = 100 #offest per i pulsanti

#log = open('log.txt', 'w')

def get_flist():
	global flist, home

	NL = '\n'
	home = os.path.dirname(os.path.abspath(sys.argv[0]))
	memofile = os.path.join(home, 'memos-list.txt')
	fdat = open(memofile, 'r')
	mdata = fdat.readlines()
	fdat.close()
	for c in mdata:
		r = c.strip(NL)
		r = r.strip()
		if len(r) > 0 and r[0] != '#':
			if os.path.isfile(r):
				flist.append(r)

	#alla fine aggiunge il suo file di configurazione
	flist.append(memofile)

	#for c in flist:
	#	log.write("%s\n" %c)
	return flist

class Slate(wx.Frame):
	def __init__(self, parent, id, title):

		flist = get_flist()
		nbtn = len(flist)
		#log.write("\n%s %s" %(OS, nbtn))
		#log.flush()

		if OS == 'Linux':
			woffset = 0
			box = 10
			boy = 10
			stile = wx.CAPTION | wx.CLOSE_BOX
		elif OS == 'Windows':
			woffset = 24
			box = 6
			boy = 6
			stile = wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
		hframe = 20 + nbtn * 40 + woffset
		wx.Frame.__init__(self, parent, id, title, size=(220, hframe),
							style = stile)
		self.pn = wx.Panel(id = 1, name = 'pn', parent = self)
		self.pn.SetBackgroundColour('green')
		#i bottoni
		for c in range(nbtn):
			y = boy + c * 40
			button = wx.Button(self.pn, id = BOFS + c, pos = (box, y),
											size = wx.Size(200, 40))
			button.SetLabel(os.path.basename(flist[c]))
			button.Bind(wx.EVT_BUTTON, self.on_button)
		self.Show(True)

	def on_button(self, event):
		global home
		quale = event.GetId()
		#self.pn.SetBackgroundColour('red')
		if OS == 'Linux':
			os.system('xdg-open "%s"' %flist[quale - BOFS])
		elif OS == 'Windows':
			sh = os.path.join(home, 'shex.exe')
			os.system('%s "%s"' %(sh, flist[quale - BOFS]))

app = wx.App() #redirect = 1, filename = 'dump.txt')
Slate(None, -1, 'memos')
app.MainLoop()

Dovrebbe essere tutto chiaro 😉 ecco comunque una piccola descrizione. Usa il modulo wx per la grafica — riga 4 — e platform per determinare il sistema operativo — righe 4 e 5.
Nel definire la finestra dell’app — righe 36 e successive — definisce alcune costanti in funzione del sistema operativo, salvato nella variabile OS. Intanto ha letto nel file memos-list.txt che si trova nella stessa directory (cartella) dello script quali sono i file da elencare. Questi file devono essere indicati uno per riga, con il nome assoluto, cioè completo del percorso (vedi esempi sotto). Se un file elencato non voglio visualizzarlo basta inserire # all’inizio del nome (come i commenti in Python). L’elenco che sarà visualizzato deriva dal controllo delle righe lette (vengono considerati solo i file esistenti) e memorizzate nella lista flist — riga 38 — che richiama la funzione get_flist(), riga 12.
Il ciclo for delle righe 59-64 crea un pulsante per ciascun file e gli assegna al pulsante stesso l’azione cui deve rispondere al click del mouse — riga 64. Questa azione viene definita alle righe 67-75. Qui ci sono alcune osservazioni da fare: per Linux uso xdg-open ma non so se funziona con KDE (prima o poi l’installo), per Windows uso shex.exe un programmino descritto tra qualche istante.
Le righe 77-79 visualizzano l’app.

Ho lasciato (commentate) delle istruzioni usate in fase di sviluppo; in particolare la lista letta e filtrata veniva scritta in un file — log.txt — e i messaggi di print in un altro — dump.txt.

Per funzionare l’app necessita del file memos-list.txt, ecco i miei:
per Linux

/media/algol/w3/harbor/_dq_
/home/juhan/apps/gargoyle/g_todo
/media/algol/lab/idea

questo è farlocco

 /media/algol/w3/t1/manca
    /media/algol/w3/t1/ye
/media/algol/w3/t1/ye con spazi
#questo è un commento
/media/BEAGLE/t.txt
/media/algol/w3/t1/Google.desktop
/media/algol/w3/t1/timothy.jpg

e per Windows

c:\t in C.txt
c:\condivisa\anaThem.txt
manca

dopo vuota
f:\t.txt
f:/t.txt
c:\okp\oook\Google.URL

Alcune osservazioni:

  • l’app visualizza qualsiasi tipo di file riconosciuto, l’ultima riga della versione Linux mostra la foto di Timothy che domani compie quattro mesi: auguri Timothy!;
  • per Windows si può usare come separatore di elenco sia \ (quello usato normalmente) che / come nella riga f:/t.txt;
  • Le righe /media/algol/w3/t1/Google.desktop (Linux) e c:\okp\oook\Google.URL (Windows) sono il risultato del trascinamento dell’icona indicata in figura dal browser alla cartella di Nautilus / Esplora risorse. Con Linux non funziona, con Windows sì ma è lentissimo :-(.

shex.exe, solo per Windows
Un po’ di tempo fa ho parlato di AutoIt. Ecco torna di moda 😀 e questa volta per un uso più da programmatore; perché AutoIt è un potente linguaggio di programmazione, meriterebbe di essere più usato e considerato. Ecco il codice di shex.au3

$param = ""
$npar = $CmdLine[0] ; numero dei parametri
For $c = 2 To $npar
    $param = $param & " " & $CmdLine[$c]
Next

ShellExecute($CmdLine[1], $param)
exit

che, con Aut2exe.exe compiliamo e otteniamo shex.exe. Shex è un wrapper a ShellExecute(), nel nostro caso raccoglie gli eventuali parametri nella variabile $param prima di eseguire la chiamata con il primo argomento, tecnicismi per geek, se funziona non aggiustarlo, anzi saltalo 😉
Al solito per lanciarlo in modo pulito, senza che compaia la finestra di Prompt dei comandi ricorriamo a AutoIt creando memos.au3

run(@ComSpec & " /c " & "python C:\OKp\memos.py", "", @SW_HIDE)

exit

che compiliamo ottenendo memos.exe (eventualmente aggiustando il percorso, se necessario).

Quindi, concludendo

Lo script dimostra come Python sia agnostico relativamente al sistema operativo, cosa buona e giusta, e che gli aggiustamenti richiesti siano minimi. Poi l’utente sceglie e si specializza: ad esempio io ho trovato Tim Golden che ha un sacco di roba per Windows. Non l’ho usata ma forse…

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • glipari  Il 15 dicembre 2010 alle 19:33

    xdg-open funziona anche su KDE (si appoggia su Freedesktop, da quel che so). Io lo uso da Emacs, ad esempio.
    Comunque, il programmino funziona egregiamente, compliments!

    Non è che possiamo fare qualcosa di più complicato con questo trascinamento? Tipo io il file che voglio mettere dentro memos-list.txt lo trascino dentro qualche finestra? quindi non solo con le URL…
    (dici che su Linux non funziona, ma sai mica che caspita di evento arriva alla finesta wxWindows quando ci trascini su qualche icona?)
    just asking…

    • juhan  Il 16 dicembre 2010 alle 06:57

      Il trascinamento: certo che si può, anzi prossimamente…

  • juhan  Il 16 dicembre 2010 alle 19:30

    Penso che sia possibile aggiornare al volo la finestra quando gli si droppa sopra l’icona di un file. Anche se oggi ho fatto tutt’altro (e internet va a singhiozzo, mannaggia a Telecom!), ho i prototipi di tutti i componenti. Ma non subito, a una certa ora noi vecchietti sapete com’è…
    Domani, forse, restate connessi 😀

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: