Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]4861[/thread]

Tk-Fehlermeldungen: bei Update in Timer

Leser: 1


<< >> 2 Einträge, 1 Seite
pktm
 2005-02-03 02:50
#42836 #42836
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

ich erhalte zur Zeit folgende Fehler:
Quote
error:not a Tk object
Tk::die_with_trace at werbung.pl line 380
main:: at C:/Perl/site/lib/Tk/After.pm line 79
(eval) at C:/Perl/site/lib/Tk/After.pm line 79
Tk::After::repeat at C:/Perl/site/lib/Tk.pm line 406
(eval) at C:/Perl/site/lib/Tk.pm line 406
Tk::MainLoop at werbung.pl line 298

Tk::Error: not a Tk object
Tk::die_with_trace at werbung.pl line 380
main:: at C:/Perl/site/lib/Tk/After.pm line 79
(eval) at C:/Perl/site/lib/Tk/After.pm line 79
Tk::After::repeat at C:/Perl/site/lib/Tk.pm line 406
(eval) at C:/Perl/site/lib/Tk.pm line 406
Tk::MainLoop at werbung.pl line 298
Tk::die_with_trace at C:/Perl/site/lib/Tk.pm line 470
main:: at werbung.pl line 380
Tk::After::repeat at C:/Perl/site/lib/Tk/After.pm line 79
[repeat,[{},after#57,2000,repeat,[\&main::]]]
("after" script)
error:not a Tk object
Tk::die_with_trace at werbung.pl line 380
main:: at C:/Perl/site/lib/Tk/After.pm line 79
(eval) at C:/Perl/site/lib/Tk/After.pm line 79
Tk::After::repeat at C:/Perl/site/lib/Tk.pm line 406
(eval) at C:/Perl/site/lib/Tk.pm line 406
Tk::MainLoop at werbung.pl line 298

Tk::Error: not a Tk object
Tk::die_with_trace at werbung.pl line 380
main:: at C:/Perl/site/lib/Tk/After.pm line 79
(eval) at C:/Perl/site/lib/Tk/After.pm line 79
Tk::After::repeat at C:/Perl/site/lib/Tk.pm line 406
(eval) at C:/Perl/site/lib/Tk.pm line 406
Tk::MainLoop at werbung.pl line 298
Tk::die_with_trace at C:/Perl/site/lib/Tk.pm line 470
main:: at werbung.pl line 380
Tk::After::repeat at C:/Perl/site/lib/Tk/After.pm line 79
[repeat,[{},after#60,2000,repeat,[\&main::]]]
("after" script)


So wirklich kann ich damit nichts anfangen.
Das Einzige was ich diesen netten Texten entnehmen kann ist, dass ich scheinbar eine Methode auf ein Objekt anwende, welches es nicht mehr gibt.
Liege ich damit in etwa richtig?

Zu meinem Code
a) Ich baue mir in einem Array (aus Hashrefs die Tk-Objekte enthalten) eine nette Tabelle bei der immer rechts ein Bildchen und links ein Label steht. So wie in HTML Tabellen, nur, dass ich das in Tk viel komplizierter geregelt habe.
b) Dann erstelle ich mir einen Timer welcher zur Aktualisierung der Tabelle aus a) dienen soll.
c) Damit ich nicht ständig neue Tk-Objekte in den RAM lade und den PC langsam aber sicher in die Knie zwinge lösche ich die alten, Tabelle-Einräge jedesmal bevor ich die Tabelle update.
Leider reicht ein einfaches Update der Tabelleneinträge nicht  aus, da die Anzahl der Einträge wechselt.
d) dann gibt es den Fehler

Anmerkung: die Daten aus denen die Tabelle erstellt wird befindet sich in einem Hash namens $glob.
Das ist zwar unschön aber zweckmäßig - zumindest während der Entwicklung, da sich der Hash seit Beginn ziemlich geändert hat.

Sub zu a) und c), die Erstellung der Tabelle
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
my $gridtable = [];
$w->erstelleObjektDatenTabelle($mw, $imageFrame, $daten, $pfeil, $pfeilEnde, $pfeilSpacer, $glob, $gridtable);

sub erstelleObjektDatenTabelle {
   my ($self, $mw, $imageFrame, $top, $pfeil, $pfeilEnde, $pfeilSpacer, $glob, $gridtable) = @_;
   # top = das Frame, wo die Sachen hin gepackt werden sollen
   # mw, imageFrame, pfeil, $pfeilEnde & pfeilSpacer sind nur zur Berechnung von Größen da
   # $glob für die Daten und bindings (textvariable)
   # $gridtable = Datenstruktur zum Ablegen der Tabellen-inhalte (Frames, Bilder, Labels)
   # gridtable muss als Arrayref übergeben werden
   # $topFrame = Frame, in dem $top erstellt wird (Übergabe zwecks löschung der alten
   # Inhalte von $top)
   
   # -- [ A ] -- # altes Frame leeren
   # alle Tk-Objekte in $gridTable löschen
   foreach ( @{$gridtable} ){
#        print Data::Dumper::Dumper( $_ );
       # Text
       $_->{'Text'}->destroy();
       # Pfeil
       $_->{'Pfeil'}->destroy();
       # Spacer
       $_->{'Spacer'}->destroy();
       # Grafik ( - Frame)
       $_->{'Grafik'}->destroy();
       # gridtable zurücksetzen
       $gridtable = [];
   } # /foreach
   
   # -- [ B ] -- # neue Tabelle erstellen

#    # dev:
#    print "\n" . '-' x 10 . "\n";
#    print "Erstellen der Datentabelle in Werbung.pl\n";
#    print "Objekt-ID: ".$glob->{'actualObject'}->{'ID'}."\n";

   for( my $cnt=0; $cnt <= $#{$glob->{'actualObject'}->{'ObjektDaten'}}; $cnt++ ){

       # -[A]- Tabelle erstellen

#        # dev:
#        print "Durchlauf: $cnt\n";
#        print "abzuarbeitender Eintrag: ".$glob->{'actualObject'}->{'ObjektDaten'}->[$cnt]."\n";

       # -[1]- zuerst den Textteil um zu sehen, ob man den Spacer vergrößern muss
       $gridtable->[$cnt]->{'Text'} = $top->Label(
           -text=> $glob->{'actualObject'}->{'ObjektDaten'}->[$cnt],
#            -textvariable => \$glob->{'actualObject'}->{'ObjektDaten'}->[$cnt],
           -font => $top->Font(-weight=>'normal',-size=>16,),
           -wraplength => ($mw->screenwidth() - $imageFrame->reqwidth()) - $pfeil->width(),
           -justify => 'left',
           -bd => 0,
           -bg => 'white',
           -relief => 'groove',
       );

       # -[2]- jetzt den Pfeil und den Spacer
       $gridtable->[$cnt]->{'Grafik'} = $top->Frame(-bd => 0,);
       $gridtable->[$cnt]->{'Pfeil'} = $gridtable->[$cnt]->{'Grafik'}->Label(-image => $pfeil,-bd => 0,);
       $gridtable->[$cnt]->{'Spacer'} = $gridtable->[$cnt]->{'Grafik'}->Label(-image => $pfeilSpacer,-bd => 0,);

       # Größe des Spacers dem Text anpassen
       $self->berechneSpacer($mw, $pfeil, $pfeilSpacer, $gridtable->[$cnt]);
#        main::berechneSpacer($mw, $pfeil, $pfeilSpacer, $gridtable->[$cnt]);

       # Frame zusammen packen
       if( $cnt != $#{$glob->{'actualObject'}->{'ObjektDaten'}} ){
           # nicht der letzte Eintrag
           $gridtable->[$cnt]->{'Pfeil'}->pack(
               -anchor=>'n',
               -expand =>1,
               -side =>'top',
               -ipadx => 0, -ipady => 0,
               -padx  => 0, -pady  => 0,
           );
           $gridtable->[$cnt]->{'Spacer'}->pack(
               -fill=>"y",
               -anchor=>'n',
               -expand =>1,
               -side =>'top',
               -ipadx => 0, -ipady => 0,
               -padx  => 0, -pady  => 0,
           );
       }else{
           # der letzte Eintrag, andere Grafik nehmen
           $gridtable->[$cnt]->{'Pfeil'}->configure(-image=>$pfeilEnde);
           $gridtable->[$cnt]->{'Spacer'}->pack(
               -fill=>"y",
               -anchor=>'n',
               -expand =>1,
               -side =>'top',
               -ipadx => 0, -ipady => 0,
               -padx  => 0, -pady  => 0,
           );
           $gridtable->[$cnt]->{'Pfeil'}->pack(
               -anchor=>'n',
               -expand =>1,
               -side =>'top',
               -ipadx => 0, -ipady => 0,
               -padx  => 0, -pady  => 0,
           );
       } # /else

       # -[B]- jetzt noch alles zusammenpacken
       $gridtable->[$cnt]->{'Grafik'}->grid(
           -column=>1,
           -row=>$cnt,
           -sticky => "ns",
       );
       $gridtable->[$cnt]->{'Text'}->grid(
           -column=>2,
           -row=>$cnt,
           -ipadx =>0,
           -columnspan=>2,
           -sticky => "w",
       );
   } # /for
   
} # /erstelleObjektDatenTabelle


Sub zu b), der Timer
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
57
58
sub start {
   # erstes Element / das in der Config eingestellte Element laden
   main::readObjekt(0) if($glob->{'actualObject'}->{'ID'} == 0);
   $ids->{objectChange} = $mw->repeat(
       $glob->{objectChangeTime},
       sub{
           $w->setID($db, $glob); # neue Objekt-Nr. aussuchen
           main::readObjekt($glob->{'actualObject'}->{'ID'}); # Objekt auslesen
           # ObjektDaten neu erstellen:
           $w->erstelleObjektDatenTabelle($mw, $imageFrame, $daten, $pfeil, $pfeilEnde, $pfeilSpacer, $glob, $gridtable, $frames[2]);
       }
   );
   # Bild in Intervall wechseln
   # Text einfügen
   # usw.
   $ids->{'generalLoop'} = $mw->repeat($glob->{'generalLoopTime'}, sub{
   # --[1]-- # Bilder updaten
       # increment counter
       $cnts->{'ObjectFotoCnt'} = main::setCnt($cnts->{'ObjectFotoCnt'});
       # clear photo to clear / gain more memory
       $foto->blank();
       # set up a new photo
#        main::WriteError('Fehler: Bild nicht gefunden', die => 1) unless -e $glob->{'actualObject'}->{'fotos'}->[$cnts->{'ObjectFotoCnt'}];
       if( defined $glob->{'actualObject'}->{'fotos'}->[$cnts->{'ObjectFotoCnt'}]
         and -e $glob->{'actualObject'}->{'fotos'}->[$cnts->{'ObjectFotoCnt'}]
         and !-d $glob->{'actualObject'}->{'fotos'}->[$cnts->{'ObjectFotoCnt'}] ){
           $foto->configure(-file => $glob->{'actualObject'}->{'fotos'}->[$cnts->{'ObjectFotoCnt'}]);
       }else{
           # no image
           $foto->configure(-file => 'c:/Perl/tk/werbung/grafiken/noImage.png' );
       }
       # update the imageFrame
       $f->update();
   # --[2]-- # Textinfos updaten
       # --[2A]-- # fixe ObjektDaten updaten
       for( my $cnt=0; $cnt <= $#{$glob->{'actualObject'}->{'FixedData'}}; $cnt++ ){
           my ($key, $val) = %{$glob->{'actualObject'}->{'FixedData'}->[$cnt]};
           # neu: textvariable
           # neuen Text einfügen
           $glob->{'actualObject'}->{'FixedData'}->[$cnt]->{$key} = $glob->{'actualObject'}->{$key};
           # Ausrichtung nciht mittels configure(anchor) ändern, da zentriert besser
           # aussieht
           main::berechneSpacer($mw, $pfeil, $pfeilSpacer, $fixedTable->[$cnt]);
           $fixedTable->[$cnt]->{'Grafik'}->update();
       } # /for
       $textFrame->update();

       # --[2B]-- # ObjektDaten updaten
       for( my $cnt = 0; $cnt <= $#{$gridtable}; $cnt++ ){
           # Text aktualisieren um Spacer neu zu berechnen
           $gridtable->[$cnt]->{'Text'}->configure(-text=> $glob->{'actualObject'}->{'ObjektDaten'}->[$cnt],);
#            # test: textvariable
#            main::berechneSpacer($mw, $pfeil, $pfeilSpacer, $gridtable->[$cnt]);
           # das neue Bild auch anzeigen lassen
           $gridtable->[$cnt]->{'Grafik'}->update();
       } # /for
   }); # /generalLoop
} # /start


Ich dachtemir zu Beginn, dass der Fehler vielleicht daher rühren könnte, dass ich die Anzahld er Elemente aus $gridtable ändere, aber die Alten Einträge nicht gelöscht habe.
Das habe ich aber durch $gridtable = [] gelöst.
Folglich müsste doch irgendwo noch stehen, dass was geändert werden soll was nicht existiert.
Das Problem mittels Exists($widget) zu umgehen ist nicht möglich, weil sonst garnichts mehr geändert wird.

Bei der Verwendung von -textvariable um das Problem des expliziten Methodenaufrufes $w->configure zu vermeiden hat nichts bewirkt, der Fehler besteht weiterhin.

Hilfe!
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pktm
 2005-02-03 03:12
#42837 #42837
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
*blöd* *blööd* *blöööd* !!!
Sowas könnte aufregen.
Ich bin in der Zeile verrutscht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
   foreach ( @{$gridtable} ){
# print Data::Dumper::Dumper( $_ );
# Text
$_->{'Text'}->destroy();
# Pfeil
$_->{'Pfeil'}->destroy();
# Spacer
$_->{'Spacer'}->destroy();
# Grafik ( - Frame)
$_->{'Grafik'}->destroy();
# gridtable zurücksetzen
$gridtable = [];
} # /foreach


Man beachte wo das $gridtable = []; steht...
Ist ja klar, dass ich das Element nicht ansprechen kann wenn ich vorher die Referenz darauf entferne...

Jetzt muss ich nurnoch heruasfinden, warum nicht das gemacht wird, was ich will...
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
<< >> 2 Einträge, 1 Seite



View all threads created 2005-02-03 02:50.