Schrift
[thread]4810[/thread]

Tk Basics: ein A.. voll variablen

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
FtR
 2004-08-07 17:09
#42403 #42403
User since
2003-08-20
39 Artikel
BenutzerIn
[default_avatar]
Jetzt hab ich ca 3 Tage mit Perl Tk gespielt und meine erste gui gebaut.

nur wenn ich das so weiter mache entsteht ein to tal hässlicher code mit einem Arm voll Variablen
fuer so ziehmlich jedes Element eine und wenn ich in den einzelenen subfunktionen draufzugreifen will müssen die auchnoch
global sein. (OK man könnte das in Array zusammen fassen aber das versteckt das nur.

Gibt es eine möglichkeit direkt oder indirekt auf die eintzelnen objekte zuzugreifen ohne sich mit den Variablen zuzuschmeissen


ach so un dieses konzept macht es mir scheinbar unmöglich neue elemente innerhal von sub anzulegen
essei den ich werfe diese von da aus in einem globalen hash ...
FtR\n\n

<!--EDIT|FtR|1091884511-->
Code: ()
1
2
print&f(($_=(3x3)."3+33")=~s=3(?![^3]|$)=&f=eg);
sub f{eval(@_?$_:"'$&+'x3");}
betterworld
 2004-08-07 17:21
#42404 #42404
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Zeig uns doch mal ein Stueck von Deinem Programm, das wir dann gemeinsam verbessern koennen.
Ishka
 2004-08-07 17:41
#42405 #42405
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
$widget->children gibt alle Kinder eines Widgets zurück (hab ich aber noch nie verwendet)

wenn du ein Widget nur anzeigen möchtest, aber sonst nichts mehr machen, kannst du den pack-Befehl gleich hinterherschicken, also zB
Code: (dl )
$main->Label(-text=>'test')->pack

funktioniert natürlich auch mit den anderen Geometriemanagern.

die Geometriemanager geben das Element zurück, dh. wenn du nur eine Veränderung vornehmen willst, geht das auch:
Code: (dl )
$main->Label(-text=>'zum Beenden anklicken')->pack->bind('<1>'=>\&exit)


Es gibt auch ne Funktion um das nächst übergeordnete Widget zu finden, aber das weiß ich nciht auswendig. Kannst ja mal in perldoc Tk::Widget suchen.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Dubu
 2004-08-07 21:14
#42406 #42406
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Fuer die Widgets, die keine aktive Funktion haben, braucht man sich gar nichts zu merken (wie Ishka schon gezeigt hat). Bei Widgets, die eine -textvariable oder ein -command fuer die Interaktion haben, auch nicht.

Da bleiben meist nicht so viele uebrig, und fuer diese kann man einen netten globalen Hash nehmen, in welchem man alle unterbringt.

Ansonsten ist es auch guter Stil, das ganze GUI-Gekroese in ein eigenes Modul auszulagern, sodass im Hauptprogramm nur noch Funktionen/Methoden daraus aufgerufen werden.
FtR
 2004-08-08 00:36
#42407 #42407
User since
2003-08-20
39 Artikel
BenutzerIn
[default_avatar]
The power of TK

Voraussetzung:
ein HoH unbekannter Natur.

Ziel:
den gesammten HoH darstellen uind jedes Fekd editieren können und das zurück in den Hash schreiben

Das Bsp.
Legt mri alle Label und Entryfelder and so das man sogar die HoH Struktur lesen kann
Problem;
1 die momentane Darstellungs form ist ncht zwingend die beste.
2, das zu rückschreiben in den hash weiß ich so garnihc wie ich das machen soll ( hab mir "validatecommand" angeschaut konnt demit aber nix anfangen )
3. das mit den scrollbalken tut nich fuer Frames.

Ideen:
gibt es eine Möglichkeit Variabelm an Entrifelder zu binden ?

Hoffung:
das Ihr alles aber auch alles was man im bezug auf Tk etc verbessern kann aufzeigt

Wunsch:
keine perldoc -f xxx Antworten


THX FtR

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use Tk;                                                                                                           
use Data::Dumper;

$hash{'KEY'}="VALUE";
$hash{'SUBKEY1'}{'KEY1'}="VALUE";
$hash{'SUBKEY1'}{'KEY2'}="VALUE";
$hash{'SUBKEY1'}{'KEY3'}="VALUE";
$hash{'SUBKEY1'}{'KEY4'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY1'}{'KEY1'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY1'}{'KEY2'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY1'}{'KEY3'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY1'}{'KEY4'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY2'}{'KEY4'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY3'}{'KEY4'}="VALUE";
$hash{'SUBKEY1'}{'SUBSUBKEY4'}{'KEY4'}="VALUE";
$hash{'SUBKEY2'}{'KEY1'}="VALUE";
$hash{'SUBKEY2'}{'KEY2'}="VALUE";
$hash{'SUBKEY2'}{'KEY3'}="VALUE";
$hash{'SUBKEY2'}{'KEY4'}="VALUE";

print Dumper(\%hash);
$top = new MainWindow;
$top->minsize( qw(300 300));
$men = $top->Frame( )->pack(-side=>"top",-fill=>"x");
$men->Button(-text=>"Dump",-command=>\&dumper)->pack();
test(\%hash);
MainLoop();

sub dumper{
print Dumper(\%hash);
}

sub test{
my $fr = $men->Frame(-relief=>"ridge",-borderwidth=>"2")->pack(-side=>"top",-anchor=>"w",-padx=>"10");
out(\%hash,$fr);
}

sub out{
# print "OUT\n";
my $ref = shift;
my $parent = shift;
my $top = $parent->Frame()->pack(-side=>"top",-padx=>"10",-padx=>"4");
my $left = $top->Frame()->pack(-side=>"left",-padx=>"10",-padx=>"4");
my $mid = $top->Frame()->pack(-side=>"left",-padx=>"10",-padx=>"4");
foreach$key ( sort keys %{$ref}){
my $fr = $parent->Frame(-relief=>"ridge",-borderwidth=>"2")->pack(-side=>"top",-anchor=>"w",-padx=>"10");
if (ref $ref->{$key}eq "HASH"){
$fr->Label(-text=>$key)->pack(-side=>"top",-anchor=>"w");
out($ref->{$key},$fr);
}
if(!ref($ref->{$key}) ) {
$left->Label(-text=>$key)->pack(-side=>"top",-anchor=>"w");
$mid->Entry(-text=>$ref->{$key}, -validatecommand=>\&val,-validate=>"focus")->pack();
}
}
}
\n\n

<!--EDIT|FtR|1091911116-->
Code: ()
1
2
print&f(($_=(3x3)."3+33")=~s=3(?![^3]|$)=&f=eg);
sub f{eval(@_?$_:"'$&+'x3");}
Rambo
 2004-08-08 11:49
#42408 #42408
User since
2003-08-14
803 Artikel
BenutzerIn

user image
frage eines unwissenden, was ist ein HoH?
dominicn
 2004-08-08 12:19
#42409 #42409
User since
2003-08-08
327 Artikel
BenutzerIn
[default_avatar]
[quote=Rambo,08.08.2004, 09:49]frage eines unwissenden, was ist ein HoH?[/quote]
ein Hash of Hashes
Strat
 2004-08-08 15:09
#42410 #42410
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=dominicn,08.08.2004, 10:19][quote=Rambo,08.08.2004, 09:49]frage eines unwissenden, was ist ein HoH?[/quote]
ein Hash of Hashes[/quote]
ist ein "mehrdimensionaler" Hash, d.h. jeder Wert des hashes ist eine Referenz auf einen anderen Hash, z.B.
Code: (dl )
1
2
3
4
my %hash = (
key1 => { key1_1 => 'val1_1', key1_2 => 'val1_2' },
key2 => { key2_1 => 'val2_1', key2_2 => 'val2_2' },
);
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
FtR
 2004-08-09 02:55
#42411 #42411
User since
2003-08-20
39 Artikel
BenutzerIn
[default_avatar]
Hi @ all

THX fuer euer interesse

da das mit dem HoH nun geklärt ist, hat sich mal wer das Bsp angeschaut und kann mir einen Tipp geben ?

Ich denke wenn sich das Ziel hier lösen lässt is Tk die Waffe meiner Wahl für das gesamt Projekt. (das hier ist nur ein Tei davon, und wie Ihr seht soll das alles mal ganz dynamisch werden. wenns fertig ist wird es OpenSorce)


FtR\n\n

<!--EDIT|FtR|1092005810-->
Code: ()
1
2
print&f(($_=(3x3)."3+33")=~s=3(?![^3]|$)=&f=eg);
sub f{eval(@_?$_:"'$&+'x3");}
Dubu
 2004-08-09 03:51
#42412 #42412
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Na gut, weil du es bist. ;)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
use Data::Dumper;

# Test-HoH
my %HoH = (
   EbeneEinsText   => 'Text auf Ebene 1',
   EbeneEinsH      => {
       EbeneZweiZahl => 22,
       EbeneZweiH      => {
           EbeneDreiZahl       => 42,
           EbeneDreiText       => '3. Ebenentext',
       },
   },
   EbeneEinsText2   => 'Noch ein Text auf E1',
);

print Dumper \%HoH; # vorher
my $Mw = MainWindow->new();
hwids($Mw, \%HoH);
$Mw->Button(-text => 'Exit', -command => sub{ print Dumper \%HoH; # nachher
       Tk::exit() })->pack;
MainLoop;


sub hwids {
   my ($parent, $hashp) = @_;
   for (sort keys %$hashp) {
       if (ref $hashp->{$_}) {
           if (ref $hashp->{$_} eq 'HASH') {
               my $newframe = $parent->Frame (-borderwidth => 1, -relief => 'sunken')
                   ->pack(-padx => 20, -anchor => 'w');
               hwids($newframe, $hashp->{$_});
           } else {
               die "Bummer: Hash member $_ is a " . ref($hashp->{$_});
           }
       } else {
           $parent->Label (-text => $_)->pack(-anchor => 'w');
           $parent->Entry (-textvariable => \$hashp->{$_})->pack(-anchor => 'w');
       }
   }
}
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-08-07 17:09.