Thread Tk-Fehlermeldungen: bei Update in Timer
(1 answers)
Opened by
pktm
at 2005-02-03 02:50
User since 2003-08-07
2921
Artikel
BenutzerIn
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
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
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
View full thread Tk-Fehlermeldungen: bei Update in Timer
|