GUI mit Perl/Tk

Perl Package Manager PPM

Was ist PPM?

PPM ist ein komfortabler Weg, Perl-Module zu installieren (oder zu deinstallieren). Seit Version 4 ist PPM in der ActiveState-Perl-Distribution mit einer grafischen Oberfläche ausgestattet. Die GUI ist soweit ich weiß in Perl/Tkx geschrieben.

Die Perl-Module werden bei PPM über PPD-Dateien beschrieben. In einer PPD-Datei steht drin, was alles zu einem Modul gehört. Das können die ganzen PM-Dateien sein, aber auch Platform-spezifische, vorkompilierte Dateien sein. Im Falle von Perl/Tk ist beispielsweise C-Code enthalten. Bei einem PPM-Paket ist dieser C-Anteil bereits fertig kompiliert. Jemand anderes hat diese Arbeit schon gemacht. Es verbleibt nur die Arbeit, das Modul zu installieren.

PPM hat aber nicht nur Vorteile. Es muss jemand die Arbeit machen, PPM-Pakete zu erstellen. Also die Pakete für bestimmte Perl-Versionen und Plattformen bereitzustellen.

Perl/Tk in PPM installieren

Liste der PPM-Repositories

Es gibt mehrere PPM-Repositories. Das wohl relevanteste kommt von ActiveState. Ein für Perl/Tk wichtiges PPM-Repository ist bribes.org. Es hat unter anderem PPDs für Tk für aktuelle Perl-Versionen.

Weitere PPM-Repos gibt es über das Modul PPM::Repositories. Leider bleibt wie bei den meisten Open-Source-Produkten die Usability des Moduls etwas hinter den Erwartungen zurück. So reicht ein Besuch der Manpage nicht aus, um die Repos zu sehen. Stattdessen muss man entweder einen Blick in den Quellcode wagen, oder man führt ein Perl-Programm aus (siehe Abschnitt SYNOPSIS).

Das nachfolgende Programm liefert (nicht ganz fehlerfrei, das Filtern im Tk::Treeplus klappt nicht immer) die PPM-Repositorys auf, die per PPM::Repositories bereitgestellt werden:

#!perl

use strict;
use warnings;
use Tk;
use Tk::Treeplus;
use PPM::Repositories;
use Data::Dumper qw/Dumper/;

my $mw = tkinit();
$mw->geometry('1024x480');

my $hlist = $mw->Scrolled('Treeplus',
    -columns => 7,
    -wrapsearch => 1,
    -indicator => 0, # If this is a flat list, we may drop the empty indicator space
    -scrollbars => 'osoe',
)->pack(-expand => '1', -fill => 'both');

# -- Header
my @headers = (qw/Repository Notes PerlO PerlV Location Type Active/);

foreach my $header_text ( @headers ) {
    $hlist->advancedHeaderCreate(
          -text => $header_text,
          -resize_column => 1,
    );
}


# -- Content
my @all_repo_info = get_all_repositories();
foreach my $record ( @all_repo_info ) {
    $hlist->add($record->{repo});
    $hlist->itemCreate($record->{repo}, 0, -text => $record->{repo});
    $hlist->itemCreate($record->{repo}, 1, -text => $record->{notes});
    $hlist->itemCreate($record->{repo}, 2, -text => $record->{os});
    $hlist->itemCreate($record->{repo}, 3, -text => $record->{version});
    $hlist->itemCreate($record->{repo}, 4, -text => $record->{location});
    $hlist->itemCreate($record->{repo}, 5, -text => $record->{type});
    $hlist->itemCreate($record->{repo}, 6, -itemtype => 'window', 
      -window => $hlist->Checkbutton(-variable => \$record->{active}));
}

# -- Refresh the content - sort according primary sort columns
$hlist->initSort();

$mw->MainLoop;
exit(1);

sub get_all_repositories {
    my @repos = ();

    while( my ($repo, $repo_info) = each %Repositories ) {
        push @repos, {
            repo => $repo,
            active => $repo_info->{Active},
            notes => $repo_info->{Notes},
            os => $repo_info->{PerlO},
            version => $repo_info->{PerlV},
            type => $repo_info->{Type},
            location => $repo_info->{location},
        };
    }

    return @repos;    
} # /get_all_repositories

Übersicht über die PPM-Repositories

Top