Tools che si possono usare con Python: wmctrl e xdg-open

In questo post voglio illustrare come sia semplice utilizzare tools liberamente disponibili per integrare le funzionalità di Python. Partirò da un’app molto elementare (e di nessuna utilità) che verrà sviluppata in qualcosa di utilizzabile, almeno io la uso abitualmente.
La prima versione è davvero banale:

#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-

import wx, os

class MyFrame(wx.Frame):
	def __init__(self, parent, id):
		wx.Frame.__init__(self, parent, id, size = (200, 150), pos = (400, 25), title = "prima versione", style = wx.CAPTION | wx.CLOSE_BOX)

		self.button = wx.Button(self, label="lancia Google") #, pos = (20, 30), size = (80, 40))
		self.button.Bind(wx.EVT_BUTTON, self.on_button_go)

	def on_button_go(self, event):
		r = os.system('firefox http://www.google.com')
		if r != 0:
			wx.MessageBox('Execution failed: %d' %r, 'error!', wx.ICON_ERROR)

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

app = MyApp()
app.MainLoop()

Volendo si può cambiare la riga #14 mettendo al posto di firefox il proprio browser preferito.
Ma un momento: ogni volta che faccio click sul pulsante mi apre una nuova pagina di Google, forse non è esattamente quello che voglio!
E qui entra in gioco wmctrl. È una piccissima utility creata e mantenuta da Tomas Styblo, noto anche come tripie disponibile sotto licenza GPL. Trovate tutto quando qui.
Tomas è attivo da lungo tempo, ha fatto un sacco di roba ma non (ancora) una sua pagina personale.
wmctrl (window manager control) fa tantissime cose: [i]t can be used, for example, to obtain information about the window manager, to get a detailed list of desktops and managed windows, to switch and resize desktops, to make windows full-screen, always-above or sticky, and to activate, close, move, resize, maximize and minimize them.

A noi interessano un paio di opzioni:

  • -R <WIN> Move the window to the current desktop and activate it.
  • -F Modifies the behavior of the window title matching algorithm. It will match only the full window title instead of a substring, when this option is used. Furthermore it makes the matching case sensitive.

Modifichiamo il nostro script, in particolare la funzione on_button_go() così:

	def on_button_go(self, event):
		r = os.system('wmctrl -R Google - ')
		if r != 0:
			r = os.system('firefox http://www.google.com')
		if r != 0:
			wx.MessageBox('Execution failed: %d' %r, 'error!', wx.ICON_ERROR)

Meglio no? Se si fa click Google viene aperto solo se non è la scheda attiva del browser.

Ma possiamo fare ancora un passo avanti: renderci indipendenti dall’identità del browser. Il S.O. sa bene come rispondere a “http:…“, per verificarlo apriamo Nautilus (o il nostro file manager) e facciamo doppio-click su un file con estensione .html o .htm e vediamo che viene aperto nel browser; facendo click su un file .jpg o .png verrà visualizzato dentro al programma settato per la visualizzazione delle immagini, un file di testo verrà aperto in un editor e così via.
Ed è quello che vogliamo fare anche noi, basta cambiare una riga di codice nel nostro script:
la riga #16 r = os.system('firefox http://www.google.com')
diventa r = os.system('xdg-open http://www.google.com')

xdg-open dovrebbe esserci su Ubuntu. Per sapere tutto su di esso digitare da terminale:
man xdg-open
per uscire da man: q, ma questo lo sapete vero?

Allora la versione definitiva del nostro script è questa:

#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-

import wx, os

class MyFrame(wx.Frame):
	def __init__(self, parent, id):
		wx.Frame.__init__(self, parent, id, size = (200, 150), pos = (400, 25), title = "terza versione", style = wx.CAPTION | wx.CLOSE_BOX)

		self.button = wx.Button(self, label="lancia Google") #, pos = (20, 30), size = (80, 40))
		self.button.Bind(wx.EVT_BUTTON, self.on_button_go)

	def on_button_go(self, event):
		r = os.system('wmctrl -R Google - ')
		if r != 0:
			r = os.system('xdg-open http://www.google.com')
		if r != 0:
			wx.MessageBox('Execution failed: %d' %r, 'error!', wx.ICON_ERROR)

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

app = MyApp()
app.MainLoop()

Il nostro pulsante ora potrebbe fare parecchie cose, in funzione del tipo di stringa che gli passiamo. Si può pensare di inserire un secondo pulsante nella finestra che apre nautilus, poi un altro ancora che…
Sì penso che nel prossimo post si possa costruire una button bar, versione spartana ma funzionale di docky, senza frills.

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • glipari  Il 8 giugno 2010 alle 22:57

    Va che è una meraviglia!

    Magari mi ci metto davvero su python. Non è che conosci qualche buon pacchetto che faccia parsing/salvataggio xml?

  • juhan  Il 9 giugno 2010 alle 07:00

    Questo è solo un intro. Sono un po’ preso ma prossimamente…

  • juhan  Il 9 giugno 2010 alle 10:13

    Per XML esistono un sacco di risorse.
    Ad es. vedi http://www.libexpat.org/ dove trovi i link a tutti i linguaggi sensati (e non).
    Un esempio veloce tanto per vedere cos’è si trova in http://www.zetcode.com/wxpython/xmlresource/
    Un altro, più articolato http://wiki.wxpython.org/UsingXmlResources con links a altre sources.
    Il capitolo 9 di “Dive Into Python”, download disponibile all’URL http://diveintopython.org/ è dedicato a XML. C’è anche la traduzione in italiano (non so se completa e aggiornata, conviene sempre verificare sull’originale), forse per qualcuno che conosco e che si lamenta su Fèissbukk 😉

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: