Tk::TableMatrix::Spreadsheet - Beispiel

Im Jahr 2005 schrieb krkeegan in seinem (englischsprachigen) Blog einen Eintrag, der einfach nur dazu diente Tk::TableMatrix zu dokumentieren. Motivation war die eher schlechte Dokumentation von Tk::TableMatrix. Es ist in der Tat etwas schwer, damit warm zu werden.

Es fängt damit an, dass eine Tabelle eine Variable benötigt, in der die Daten abgelegt werden. Diese Variable muss mit dem Parameter -variable angegeben werden. Es ist möglich, einfach eine Variable zu definieren. Oder man übergibt direkt eine Vorausgefüllte Datenstruktur, in der bereits Daten enthalten sind.

Der Zugriff auf Zellen erfolgt über Indizes. Ein Index besteht immer aus 2 Zahlen, die durch ein Komma getrennt werden. Er wird als String repräsentiert, z.B. "0,0" für die linke obere Ecke. Die erste Zahl steht dabei für die Zeile, die zweite für die Spalte. Die Zählung beginnt oben links.

Der Tk::TableMatrix-Beispielcode von krkeegan sieht vor, das der Nutzer Zeilen auswählen kann. Dazu wird der -selectmode entsprechend konfiguriert. Die ausgewählte Zelle wird hervorgehoben.


Perl-Quellcode

#!perl

use strict;
use warnings;
use utf8;
use Tk;
use Tk::TableMatrix::Spreadsheet;

my $mw = Tk::MainWindow->new();
$mw->configure(-title => "ID3 Tag Genre and Year Fixer");
$mw->minsize(qw(500 200));

my $menu = $mw->Frame()->pack(-side => "top", -fill => 'x');
my $menu_file = $menu->Menubutton(
	-text => "File",
	-tearoff => "false",
)->pack(-side => "left");
$menu_file->command(
	-label => "Exit",
	-command => sub{ $mw->destroy(); },
);

my $frame = $mw->Frame(
	-height 		=> 10,
	-width			=> 30,
	-relief			=> "groove",
	-borderwidth	=> 3,
)->pack(-fill => 'x', -pady => 0);

my @border = (0,0,0,1);

my %table_data = (
	'0,0' => '%',
	'0,1' => 'Artist',
	'0,2' => 'Album',
	'0,3' => 'Year',
	'0,4' => 'Genre',
	
	# fill field
	'3,3' => 'Test',
);

my $table = $frame->Scrolled("Spreadsheet",
	-scrollbars		=> 'se',
	-cols 			=> 5,
	-width 			=> 5,
	-height 		=> 6,
	-titlerows 		=> 1,
	-variable		=> \%table_data,
	-selectmode		=> 'multiple',
	-selecttype		=> 'row',
	-resizeborders	=> 'col',
	-bg 			=> 'white',
	-rowheight 		=> 2,
	-bd 			=> \@border,
	-justify 		=> 'left',
	-drawmode 		=> 'compatible',
	-wrap 			=> 0,
	-relief 		=> 'solid'
)->pack(-fill => 'both');

$table->rowHeight(0,1);
$table->tagRow('title',0);
$table->tagConfigure('title', -bd => 2, -relief => 'raised');
$table->colWidth(0,5,3,6,4,10);

insert_data($table);

$mw->MainLoop();

exit(0);

=head1 SUBS

=head2 insert_data( $table_object )

=cut

sub insert_data {
	my $tbl = shift;
	
	# usage: $table->set(?row|col?, index, ?value?, ?index, value, ...?)
	# Sets the specified index to the associated value.
	$tbl->set(
		'1,0' => '46%',
		'1,1' => 'Eminem',
		'1,2' => 'The Eminem Show',
		'1,3' => 2002,
		'1,4' => 'Hardcore Rap',
	);
	
	# set a single field
	$tbl->set('2,0' => '0%');
	
	return;
} # /insert_data
Top