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

Speicherzugriffsfehler bei Tk (Seite 2)

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
betterworld
 2006-10-05 06:06
#45823 #45823
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=ptk,05.10.2006, 02:12]Mehr als ein MainWindow sollte man sowieso nicht erzeugen.[/quote]
Wohingegen in perldoc Tk::MainWindow steht:
Quote
Unlike the standard Tcl/Tk's wish, perl/Tk allows you to create several MainWindows.
ptk
 2006-10-06 02:47
#45824 #45824
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man läuft gerne mal in Fallen, wenn mehrere MainWindows im Spiel sind. Zum Beispiel läuft folgendes selbst definiertes Widget mit mehreren Toplevels ohne Probleme:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use strict;
use Tk;

{
package Tk::MyLabel;
use base qw(Tk::Derived Tk::Label);
Construct Tk::Widget 'MyLabel';

our $photo;

sub Populate {
my($w, $args) = @_;
$photo ||= $w->Photo(-file => Tk->findINC("Xcamel.gif"));
$args->{-image} = $photo;
}
}

my $mw = tkinit;
$mw->MyLabel->pack;
$mw->MyLabel->pack;
MainLoop;

Verwendet man MyLabel in einem neuen MainWindow, dann knallt es. Der Grund ist, dass das gecachte Bild nur im ersten MainWindow gültig ist. Das kann nicht nur mit Bildern, sondern auch mit Fonts, vielleicht auch mit weiteren Ressourcen passieren.

Ich sag das nur, weil ich bei der Implementierung von Tk::FBox (aka getOpenFile/getSaveFile) in diese Falle gelaufen bin...
Ishka
 2006-10-06 02:54
#45825 #45825
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Aber dieses Verhalten kann durchaus auch erwünscht sein. Und wenn eine Möglichkeit offen steht, etwas zu machen, dann sollte es auch funktionieren.
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}
ptk
 2006-10-06 03:11
#45826 #45826
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Es gab da noch einen Problem, das ich bei der Verwendung von zwei MainWindows unter Windows gesehen habe: wurde das erste MainWindow geschlossen, gab es ein automatisches Raise vom Konsolenfenster, von dem das Programm gestartet wurde (oder das zweite MainWindow wurde gelowered).

Es gibt kaum ein Grund, mehrere MainWindows benutzen zu müssen. Mehrere Toplevel tun es in 95% aller Fälle auch. Oder kennt ihr tatsächlich Anwendungsfälle für multiple MainWindows?
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2006-09-04 18:38.