Schrift
[thread]12503[/thread]

Perl/Tk: Photo auf einem Canvas austauschen

Leser: 3


<< >> 2 Einträge, 1 Seite
Gast Gast
 2008-09-16 14:05
#114698 #114698
Hallo,
ich möchte auf einem zweiten Fenster auf dem sich ein png-Bild befindet das Bild wechseln ohne dass das Fenster geschlossen und neu gezeichnet werden muss.
So wie ich es jetzt habe wird aber immer ein zweites Bild unter dem ersten hinzugefügt.
Code (perl): (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
use Tk;
use Tk::PNG;
use strict;
use warnings;
use FindBin;

my $main = new MainWindow;

our $DiagramWin;
our $DiagramWin_open = 0;

my $butShow1 = $main -> Button(-text=>" Show 1 ", -command =>\&butShow1_clicked) ->pack(-side => 'top');
my $butShow2 = $main -> Button(-text=>" Show 2 ", -command =>\&butShow2_clicked) ->pack(-side => 'top');
my $butQuit  = $main -> Button(-text=>" Close  ", -command =>\&DiagramWin_close) ->pack(-side => 'top');

MainLoop;

sub butShow1_clicked { &DiagramWin_show("wetterdiagramm1.png") };
sub butShow2_clicked { &DiagramWin_show("wetterdiagramm2.png") };

sub DiagramWin_show 
{
        my $png_filename = shift;
        if ($DiagramWin_open eq 0)
        {
                $DiagramWin = $main -> Toplevel (-title=> "Unterfenster", -width=>1024, -height=>768);
                $DiagramWin -> OnDestroy(\&DiagramWin_destroyed);               
        }
        
        my $canv = $DiagramWin -> Canvas(-width => 1024, -height => 768, -background => 'dark slate gray')->pack;
        
        my $diagram = $FindBin::Bin . "/" . $png_filename;
        $canv -> create ('image', 0, 0, -image => $main->Photo(-file=> $diagram), -anchor => 'nw');             
        $DiagramWin_open = 1;
} 

sub DiagramWin_close
{
        if ($DiagramWin_open) { $DiagramWin -> destroy(); }
        $DiagramWin_open = 0;
}

sub DiagramWin_destroyed
{
        $DiagramWin_open = 0;
}


Hat jemand einen Tip? Oder muss ich für alles eine globale Variable anlegen?

Danke und Gruß
Thomas
Gast Gast
 2008-09-16 16:43
#114710 #114710
Ich habe das jetzt mal mit globalen Variablen gelöst, obwohl ich das nicht sehr schön finde:
Code (perl): (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
use Tk;
use Tk::PNG;
use strict;
use warnings;
use FindBin;

my $main = new MainWindow;

our $DiagramWin;
our $DiagramWin_open = 0;
our $canv; # Canvas auf Unterfenster

our $diagram = $main -> Photo(); # leeres Bildobjekt erstellen
                
my $butShow1 = $main -> Button(-text=>" Show 1 ", -command =>\&butShow1_clicked) ->pack(-side => 'top');
my $butShow2 = $main -> Button(-text=>" Show 2 ", -command =>\&butShow2_clicked) ->pack(-side => 'top');
my $butQuit  = $main -> Button(-text=>" Close  ", -command =>\&DiagramWin_close) ->pack(-side => 'top');

MainLoop;

sub butShow1_clicked { &DiagramWin_show("wetterdiagramm1.png") };
sub butShow2_clicked { &DiagramWin_show("wetterdiagramm2.png") };

sub DiagramWin_show 
{
        my $png_filename = shift;       
        if ($DiagramWin_open eq 0) # nur aufrufen wenn Fenster noch nicht existiert
        {
                $DiagramWin = $main -> Toplevel (-title=> "Unterfenster", -width=>1024, -height=>768);
                $DiagramWin -> OnDestroy(\&DiagramWin_destroyed);       
                $canv = $DiagramWin -> Canvas(-width => 1024, -height => 768, -background => 'dark slate gray')->pack;
                $canv -> create ('image', 0, 0, -image => $diagram, -anchor => 'nw');
        }               
        $diagram -> configure (-file => $FindBin::Bin . "/" . $png_filename);   
        $DiagramWin -> update(); # Fenster aktualisieren        
        $DiagramWin_open = 1;
} 

sub DiagramWin_close
{
        if ($DiagramWin_open) { $DiagramWin -> destroy(); }
}

sub DiagramWin_destroyed
{
        $DiagramWin_open = 0;
}
<< >> 2 Einträge, 1 Seite



View all threads created 2008-09-16 14:05.