Introduzione a Perl/Tk

Andare in basso

Introduzione a Perl/Tk

Messaggio Da floatman il Mer Set 16, 2009 12:33 pm

Ultimamente mi sto appasionando parecchio a Perl/Tk, che per chi non lo sapesse è un modulo di Perl per la creazione di interfacce Tk tramite Perl Razz
Perl è un linguaggio decisamente piacevole, che certamente non basa la sua fama sull'aspetto grafico delle sue applicazioni.
Prima di lavorare sul suo abbinamento con Tk ho sempre pensato che fosse un mezzo abbastanza minimale di sviluppo GUI, invece mi sono ricreduto e devo dire che permette la produzione di programmi di buon livello.

Come ogni tutorial sulle applicazioni GUI, iniziamo con il codice di una semplice finestra:


Codice:
#!/usr/bin/perl -w

use strict;
use Tk;

my $progname="Finestra con Perl::Tk";

my $mw=MainWindow->new(-title=>"$progname"
                                          -width=>300,
                                          -height=>200);

MainLoop;
Ovviamente è necessario caricare il modulo Tk.
I due elementi fondamentali sono la dichiarazione di MainWindow e la funzione MainLoop che sono obblicatorie.
Sebbene il codice non richieda commenti, si farà qualche precisazione in riferimento ad altri linguaggi...
Innanzitutto la funzione MainWindow indica una finestra contenitore di altri widget; è possibile cioè l'inserimento di più funzioni MainWindow figlie.
Altra caratteristica importante è la chiusura dell'applicazione, che può avvenire semplicemente chiudendo la finestra anche se è presente la possibilità di inserire una funzione "destroy".

Nel prossimo esempio aggiungeremo infatti due bottoni; uno per l'apertura del terminale e uno per la chiusura della finestra:



(lo so che è brutto...aspettate un attimo)
Codice:
#!/usr/bin/perl -w

use strict;
use Tk;

my $progname="Bottoni con Perl::Tk";

my $mw=MainWindow->new(-title=>"$progname");
$mw->minsize(300,200);

my $butt1=$mw->Button(-text=>"Term",
                                    -command=>sub{system("x-terminal-emulator &")})
->pack(-anchor=>"w");

my $butt2=$mw->Button(-text=>"Close",
                                    -command=>sub{$mw->destroy})
->pack(-anchor=>"e");

MainLoop;
(su Windows potete modificare l'apertura del terminale com un "cmd" o qualunque altro programma vogliate)
Come si può notare le misure della finestra sono state sostituite con "->minsize(300,200)" per evitare che larghezza e altezza siano gestite in base al contenuto della finestra stessa.
L'elemento "pack" è obbligatorio e può avere valore nullo [->pack()], in questo caso abbiamo inserito la posizione dei bottoni rispetto alla riga in cui sono inseriti. "w" (sinistra) e "e" (destra) stanno per "west" e "east" (e non si usano "l" e "r" come farebbe qualunque essere razionale...)

Come si vede in questo modo non è possibile affiancare più bottoni, per fare ciò è necessaria l'aggiunta di un frame:


Codice:
#!/usr/bin/perl -w

use strict;
use Tk;

my $progname="Frame con Perl::Tk";

my $mw = MainWindow->new(-title=>"$progname",
                                            -width=>300,
                                            -height=>200);

my $firstframe = $mw->Frame(-relief => "raised")
->form()
->pack(-side=>"left");

my $secondframe = $mw->Frame(-relief => "raised")
->form()
->pack(-side=>"right");

my $butt1 = $firstframe->Button(-text=>"Term1",
                                                -width=>"16",
                                                -command=>sub{system("x-terminal-emulator &")})
->pack();

my $butt2 = $firstframe->Button(-text=>"Close1",
                                                -width=>"16",
                                                -command=>sub{$mw->destroy})
->pack();

my $butt3 = $secondframe->Button(-text=>"Term2",
                                                    -width=>"16",
                                                    -command=>sub{system("x-terminal-emulator &")})
->pack();

my $butt4 = $secondframe->Button(-text=>"Close2",
                                                    -width=>"16",
                                                    -command=>sub{$mw->destroy})
->pack();

MainLoop;
Semplice e inutile come piace a me xD
Ad esempio lo stesso metodo può venire utilizzato per create un piccolo pannello di controllo del mio Fluxbox, senza aprire kcontrol ogni volta Smile

Per concludere, la nostra GUI cosa deve avere? Ovviamente il menu...
Per motivi di lunghezza, togliamo tutta la parte sui bottoni e creiamo una semplice finestra con un bel menu:


Codice:
#!/usr/bin/perl -w

use strict;
use Tk;
use Tk::FileSelect;
use Tk::Dialog;

# ------- Main window -------

my $mw = MainWindow->new(-title=>"Menu con Perl::Tk");
$mw->minsize(300,200);

# ------ Frame del menu -----

my $app_menu = $mw->Frame(-relief => "raised",
                                              -borderwidth => 1)
->form(-top=>"%0",
            -left=>"%0",
            -right=>"%100");

# ----------- Menu -----------

# File
$app_menu->Menubutton(-text => "File",
                                      -menuitems => [
                                      [Button => "Open...",
                                        -command => \&open_file,
                                        -underline => 0,
                                        -accelerator => "CTRL+O" ],
                                      [Button => "Quit",
                                        -command => \&close ],
                            ]
                          )
->pack(-side=>"left");

# Help
$app_menu->Menubutton(-text => "Help",
                            -menuitems =>[
                         [Button => "Help",
                           -command => \&help,
                           -underline => 0,
                           -accelerator => "CTRL+H" ],
                         [Separator => ""],
                         [Button => "About",
                           -command => \&about,
                           -underline => 0,
                           -accelerator => "CTRL+H" ],
                         ]
                            )
->pack(-side=>"right");

MainLoop;

# --- funzioni richiamate: ---

sub open_file {
   
   my $file = '';
   $file = $mw->FileSelect()->Show;
 
  }

sub close {
   
   $mw->destroy;
   
   }

sub help {
   
   my $help_box = $mw->Dialog(-title => "What?",
                                -text => "This program can't do anything!",
                                -buttons => ["OK"])
   ->Show;
   
   }

sub about {
   
   my $about_box = $mw->Dialog(-title => "What else?",
                                  -text => "This Stupid program created by floatman Really Can't Do Anything!",
                                  -buttons => ["OK"])
   ->Show;
   
   }
Bello...mica tanto xD Comunque partiamo dall'inizio...

Le dichiarazioni di Tk::FileSelect e Tk::Dialog sono date come implicite nel terminale, quindi anche se vengono omesse il programma funziona ugualmente.

Il nostro menu è inserito in un frame largo tutta la finestra, in questo modo sarà possibile inserire altri frame, facendoli "confinare" con il menu:

my pippo = $mw->Frame()
->form(-top=>$app_menu,-left=>'%0',-right=>'%100',-bottom=>'%100');


Il valore '-relief => "raised"' indica l'aspetto del menu "sbalzato", cioè che sembra essere più alto del resto della finestra. L'altra opzione è "sunken", con un menu dall'aspetto "incavato"...siccome floatman non lo sa spiegare provate xD

Come vedete le voci del menu sono indicate da Menubutton:

$mio_menu->Menubutton( -text=>"Nome", -menuitems=>[ [Button=>"Nome1", -command=>\&func1], [Button=>"NomeN", -command=>\&funcN] ] )

-underline => N, imposta il carattere sottolineato per l'indicazione del tasto rapido (la numerazione parte da "0").
-accelerator => "xyz", visualizza il tasto rapido nel menu.

Le altre due funzioni inserite utilizzano: FileSelect per la visualizzazione della finestra di selezione file, in questo caso senza opzioni perchè tanto il programma non serve a niente xD



Dialog per la creazione di una finestra di dialogo, in modo da specificare bene che il programma non serve a niente...



Per maggiori info su tutte le opzioni e widget disponibili, si rimanda a alla consultazione dell'apposito manuale (man Tk e man Tk::nome_widget)

Come potete vedere in questa descrizione sommaria, l'utilizzo è decisamente semplice ma efficace.
Estremamente divertente ^^
avatar
floatman

Messaggi : 844
Data d'iscrizione : 14.09.09

Visualizza il profilo dell'utente http://myville.altervista.org

Tornare in alto Andare in basso

Re: Introduzione a Perl/Tk

Messaggio Da Slack il Mer Set 16, 2009 4:58 pm

Le Tk sembrano le più facili librerie grafiche a mio avviso.
Ma da quello che ho visto non sono le migliori...
avatar
Slack

Messaggi : 248
Data d'iscrizione : 14.09.09
Località : /home/slack

Visualizza il profilo dell'utente http://linux.forumattivo.eu

Tornare in alto Andare in basso

Re: Introduzione a Perl/Tk

Messaggio Da Ospite il Mer Set 16, 2009 6:29 pm

le tk sono facili da usare, io stesso le utilizzo quando devo fare qualche script e renderlo più "umano", ma le migliori per me sono le gtk2

Ospite
Ospite


Tornare in alto Andare in basso

Re: Introduzione a Perl/Tk

Messaggio Da floatman il Mer Set 16, 2009 9:56 pm

l'utilizzo di Tk è graficamente parlando abbastanza minimale; diciamo che Perl come ho detto sicuramente non è apprezzato per le sue interfacce Very Happy
avatar
floatman

Messaggi : 844
Data d'iscrizione : 14.09.09

Visualizza il profilo dell'utente http://myville.altervista.org

Tornare in alto Andare in basso

Re: Introduzione a Perl/Tk

Messaggio Da Contenuto sponsorizzato


Contenuto sponsorizzato


Tornare in alto Andare in basso

Tornare in alto

- Argomenti simili

 
Permessi di questa sezione del forum:
Non puoi rispondere agli argomenti in questo forum