Schrift
[thread]8803[/thread]

Tk::Error: Usage $widget->destroy(...) - Ursache?

Leser: 3


<< >> 6 Einträge, 1 Seite
GoodFella
 2007-03-01 15:28
#74740 #74740
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Hi, mache zur Zeit mehrere Sachen gleichzeitig, deswegen meine vielen Posts heute.

Ich habe ein grosses Script, welches folgenden Fehler produziert:
Quote
destroy (1):
0 0x2b9589c PV f=00080004 {}(5)(1)
SV = PV(0x2b833f8) at 0x2b9589c
REFCNT = 1
FLAGS = (ROK)
RV = 0x2b91e64
PV = 0x2b91e64 ""
CUR = 0
LEN = 0
bzw. in mein Errorlog wird geschrieben:
Quote
1.03.2007 14:18:50 :
--------->
Tk::Error: Usage $widget->destroy(...) at mmc.pl line 2001.
Tk callback for .toplevel.toplevel.toplevel
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.frame
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.frame.labentry
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.toplevel
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.toplevel.frame
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.toplevel.frame.ysbslice
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry.toplevel.frame.ysbslice.corner
Tk callback for .toplevel.toplevel.toplevel.jbrowseentry
main::update_sort_widgets at mmc.pl line 2001
main::get_sort_params at mmc.pl line 2035
main::process at mmc.pl line 2149
main::__ANON__ at mmc.pl line 1510
Tk callback for .toplevel.button2
Tk::__ANON__ at C:/Perl/lib/Tk.pm line 252
Tk::Button::butUp at C:/Perl/lib/Tk/Button.pm line 111
<ButtonRelease-1>
(command bound to event)

<---------


Zeile 2001 und Umgebung:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub update_sort_widgets
 {
  my ($parent, $count) = @_;
  my @dirs = keys(%sort_dirs);  
  for(my $i=0; $i<=$#be_sort_field; $i++) { $be_sort_field[$i]->destroy() if ($be_sort_field[$i]); } @be_sort_field = ();
  for(my $i=0; $i<=$#be_sort_dir; $i++)   { $be_sort_dir[$i]->destroy() if ($be_sort_dir[$i]); }     @be_sort_dir = ();
  for(my $i=0; $i<=$#lbl_sort_nr; $i++)   { $lbl_sort_nr[$i]->destroy() if ($lbl_sort_nr[$i]); }     @lbl_sort_nr = ();

...

@be_sort_field / @be_sort_dir / @lbl_sort_dir sind per my definierte Globale Vars, die Widgets enthalten.
(be für browseentry, lbl für Label)
Ich kann mir nicht vorstellen, wie die Fehlermeldung zustande kommt, habe per google zwar gefunden, dass in einem ähnlichen Fall ein mainwindow mehrfach erzeugt wurde (oder so ähnlich), dies trifft aber nicht auf mein Problem zu.
Weiss jemand, woran es liegt?
ptk
 2007-03-02 21:29
#74741 #74741
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Sieht wie ein doppeltes destroy aus. Einfach zu reproduzieren:
Code: (dl )
1
2
3
4
use Tk;
$mw = tkinit;
$mw->destroy;
$mw->destroy;
ptk
 2007-03-02 21:33
#74742 #74742
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man kann übrigens mit Tk::Exists($widget) prüfen, ob ein Widget nocht existiert. Eine einfache boolsche Prüfung reicht nicht!
GoodFella
 2007-03-24 02:50
#74743 #74743
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,02.03.2007, 20:33]Man kann übrigens mit Tk::Exists($widget) prüfen, ob ein Widget nocht existiert. Eine einfache boolsche Prüfung reicht nicht![/quote]
Danke, Tk::Exists ist genau das, wonach ich gesucht habe.
pktm
 2007-03-24 23:33
#74744 #74744
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
[quote=ptk,02.03.2007, 20:33]Man kann übrigens mit Tk::Exists($widget) prüfen, ob ein Widget nocht existiert. Eine einfache boolsche Prüfung reicht nicht![/quote]
Wie ist denn das bei Folgendem:
Ich habe eine Variable, die ein WIdget emthält, z.B. my $l = $mw->Label(-text => 'test',)->pack();
Jetzt vernichte ich das Teil: $l->destroy();
Dann habe ich in $l ja immernoch was stehen, weshalb die boolsche Abfrage nicht ausreicht (was ich seit einer Minute weis, cool! Damit habe ich mich letzten 4 Stunden lang rumgeärgert.).
Das bedeutet ja, dass immer noch was übrig bleibt, wenn destroy() ausgeführt wird. Warum?
Bringt es was, wenn ich $l = undef; mache?
Hat das Nebenwirkungen?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
ptk
 2007-03-24 23:52
#74745 #74745
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du kannst zusätzlich zu $l->destroy auch $l=undef; schreiben. Aber was ist, wenn du noch irgendwo eine Referenz auf das gerade zerstörte Widget hast und dieses auch aus Versehen verwendest?. Tk::Exists ist die sicherste Lösung.

Oder du verwendest overload:
Code: (dl )
1
2
3
4
5
6
{
package Tk::Widget;
use overload
'bool' => \&Tk::Exists,
'fallback' => 'TRUE';
}


Dann kannst du weiterhin if ($l) { ... } verwenden.
<< >> 6 Einträge, 1 Seite



View all threads created 2007-03-01 15:28.