Category Archives: Zenity / yad

Intro a Python per Windows — 7: GUI (inizio)

Basta con il Prompt dei comandi (quello che alcuni chiama terminale), vogliamo le finestre, complete dei relativi oggetti per l’interazione! 😀
Sì, va bene; oggi iniziamo. E partiamo da cose molto semplici, ma poi, forse…

Zenity
Ho raccontato di Zenity in un post precedente, qui.

La si parlava di zenity per Linux ma è una cosa talmente bella che c’è stato chi l’ha portata su Windows: Placella.com. Chi è Placella? Mystero mysterioso 😉 non mette mai un about nelle sue pagine, è peggio di me!
In ogni caso Placella ha fatto un ottimo lavoro per cui propongo di andare qui, ammirare l’immagine di presentazione di Zenity per Windoze e scaricarlo, seguendo il link sulla stessa pagina. Non resta che installarlo e il gioco è fatto.
Se ho capito bene la versione win32-3 non è ancora pronta, per precauzione ho installato la win32-2.

Pronti a provarlo?
Con Notepad2 creiamo, nella cartella C:\OKp il file test_z.bat con il seguente contenuto

@echo off
zenity  --question --ok-label="Yes" --cancel-label="No" --text="Please press a button."
if %ERRORLEVEL% == 1 goto error
    zenity --info --text="You pressed Yes!"
    goto end
:error
    zenity --error --text="You pressed No!"
:end

e possiamo provarlo in due modi.
modo 1 – Apriamo il Prompt dei comandi (dai è l’ultima volta) e andiamo nella directory OKp (cd \Okp, eventualmente cambiano il disco se richiesto, es. D:).
Diamo il comando test_z e otterremo

e a seconda della scelta potremo avere una delle due finestre in figura

modo 2 – Apriamo Explorer (Esplora risorse) e navighiamo fino a C:\OKp, facciamo doppio click sull’icona test_z (o test_z.bat se abbiamo settato di non nascondere le estensioni) e otterremo lo stesso risultato del modo 1, senza bisogno del Prompt dei comandi 😀

Naturalmente con Zenity si possono fare tante altre cose. Una che su Ubuntu rischia di passare inosservata è la notifica. Su Windows probabilmente nessuno la noterebbe! Comunque per chi volesse provarla eccola

zenity --notification --window-icon="info" --text="Attento: da quanti giorni non fai il backup?"

che produce

La notifica è l’icona con la lampadina, il messaggio compare solo se con il mouse vi fermate sull’icona e tipicamente le icone nell’area di notifica sono parecchie e solo alcune sono sempre visibili, quella no.

AutoIt
I più attenti quando hanno provato il modo 2 avranno senz’altro notato un flash di buio, come se la famigerata finestra di Prompt dei comandi apparisse per un attimo e si chiudesse subito. Sì è proprio successo quello. Placella è conscio del problema e propone una sua soluzione, non tanto bella, esiste un’alternativa semplice e potente: AutoIt.
AutoIt fa tante cose, è un vero e proprio linguaggio di programmazione, gratuito, facile e efficiente (per quasi tutto, ha delle limitazioni). Noi ne useremo una parte piccolissima. E siamo anche sfortunati: qualcuno ha pensato di fare un virus chiamandolo AutoIt per cui l’antivirus salta su allarmato. Non è un virus, almeno quello che usiamo noi 🙂

Allora con Notepad2 creiamo il file atz.au3 con il seguente contenuto

run(@ComSpec & " /c " & 'C:\OKp\test_z.bat', "", @SW_HIDE)
exit

Con Explorer andiamo nella cartella AutoIt/Aut2Exe e lanciamo Aut2exe, compare questo dialogo che compiliamo come in figura

Facendo click su Convert succedono due cose: un messaggio che la conversione è stata completata e un’allerta dell’antivirus. Nel mio caso questo qui

siccome sappiamo che è un falso allarme chiudiamo la finestra e tornando in OKp possiamo lanciare atz.exe che fa esattamente quanto ci eravamo proposto.

Soluzioni alternative
Ci sarebbero anche altri componenti da esaminare, per esempio EasyGui, eccone un esempio, solo un assaggino

from easygui import *
import sys

while True:
	msg ="What is your favorite flavor?"
	title = "Ice Cream Survey"
	choices = ["Vanilla", "Chocolate", "Strawberry", "Rocky Road"]
	choice = choicebox(msg, title, choices)

	if choice == None:
		sys.exit(0)

	msgbox("You chose: " + str(choice), "Survey Result")

perché funzioni dovete scaricare il file easygui_v0.95.zip e estrarre easygui.py nella stessa cartella dello script (la solita OKp).
Altre ancora se ne possono trovare con un po’ di googlaggio, ma non so se è quello che vogliamo.

Quindi, alla fine della fiera
Oggi abbiamo visto come costruire semplici finestre per interagire con il PC, usando pacchetti molto elementari. Troppo elementari forse, quando il gioco si fa duro Python e/o i suoi amici entrano in campo (cit.). E, tutto sommato, una volta visto come si fa è anche più semplice, restate sintonizzati 😀

Zenity e PyZenity

Alle volte capita di dover visualizzare un’informazione al volo e sarebbe bello se fosse possibile farlo senza troppi sforzi. Quando il mondo dei ‘puter era nuovo (“in the beginning” dice Neal Stephenson) c’era la linea di comando e il comando era echo. Lo è ancora ma oggi si usa l’interfaccia a finestre e il terminale l’utente tipo non lo vede. Non vale recriminare sul bel tempo andato, cioè uno può anche farlo ma non è certo produttivo.
La prima idea per me è stata di costruirmi un equivalente grafico di echo. Anzi ne ho fatto due versioni, la prima utilizzando tcl/tk, poi rimpiazzata da Python per standardizzarmi con me stesso.
Problema risolto? Sì, funziona, è semplice da usare e immediato. Fine 🙂

Non proprio.
Qui potrei fare un lungo discorso sulla serendipity/serendipità ma chi vuole se lo trova bello confezionato su Wikipedia (come sarebbe meno bello il mondo se non ci fosse Wikipedia!). Davvero vi conviene farci un salto, c’è anche questa definizione:

Serendipity is looking in a haystack for a needle and discovering a farmer’s daughter.

dovuta a Julius Comroe Jr., 1976, autore che non conosco ma meriterebbe.

Tornando a bomba cercando altro mi sono imbattuto in Zenity. Chissà quante volte l’ho fatto in passato senza accorgermene, sono lento di comprendonio, quello che a Torino si chiama gnugnu.
Sì esiste una pagina Wiki anche per Zenity, solo in inglese. Ci sono anche un paio di pagine su Gnome, qui e qui sulla Free Software Foundation.

Poi sul web ci sono millemila pagine di esempi, basta googlare.
Oltre alle cose eccezionali demandate al lettore come esercitazione per non privarlo del piacere della scoperta voglio solo far vedere due cosette.
Se devo visualizzare una nota in modo non invasivo posso fare così:

#!/bin/sh
zenity --notification\
    --window-icon="info" \
    --text="Attento: da quanti giorni non fai il backup?"

che produce

(il testo (tooltip) compare solo quando il cursore del mouse è sull’icona, naturalmente).

Forse è troppo piccola e poco appariscente e allora toniamo a echo, anzi aecho. Eccolo:

#!/bin/bash
if [ $# = 1 ]
then
    zenity --info \
        --title="aecho" \
        --text="$1"
elif [ $# = 2 ]
    then
        zenity --info \
            --title="$2" \
            --text="$1"
else
    zenity --$3 \
        --title="$2" \
        --text="$1"
fi

E questi sono i risultati, rispettivamente per:

sh aecho.sh "prova di zenity\npasso solo il testo\ndel messaggio"
sh aecho.sh "prova di zenity\npasso il testo e il titolo\ndel messaggio" "prova di Zenity"
sh aecho.sh "prova di zenity\npasso il testo, il titolo\ne l'icona\ndel messaggio" "prova di Zenity" "error"

Adesso racconto una cosa che mi ha fatto perdere parecchio tempo (sono un po’ troppo gnugnu). Non dimenticate le virgolette attorno a $1 e $2 nello script, altrimenti Zenity visualizza solo la prima parola.

PyZenity
Zenity fa tutto quello che volevo fare e per cui avevo rivoltato mari e monti (non esattamente ma passatemi l’iperbole, solo questa volta, non lo faccio più). Si può volere di più ancora? Ad esempio richiamare le sue funzionalità dentro Python? C’è chi ci ha pensato ed ha fatto un lavoro superlativo: il modulo PyZenity di Brian Ramos.
La pagina di Brian ha tutto: cos’è, download, documentazione.
E aggiunge meraviglia a meraviglia.

Inoltre…
Sembra che PyZenity sia solo per Linux, almeno l’installer. Per Windoze bisognerebbe provare.
Nei commenti al post precedente xxx (bel nick!) mi indicava PyZenity (l’avevo già scoperto) mentre ero indaffarato a cercare la soluzione dell’errore delle quote. E non c’è niente di peggio che le continue interruzioni date dal flusso degli eventi del mondo esterno. I post si devono fare la domenica mattina o, previo recupero di un portatile, imboscandosi, senza portarsi dietro il telefono cellulare 😉