Schrift
[thread]5149[/thread]

Tk::Animation woes



<< >> 8 Einträge, 1 Seite
ptk
 2005-12-28 03:05
#45148 #45148
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ein Benutzer in einem anderen Perl-Forum hat Probleme mit animierten GIFs, die Transparenz enthalten. Bei diesen GIFs wird das vorherige Bild nicht gelöscht. Sein Skript:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use Tk;
use Tk::Animation;

my $scale;
my $haupt = new MainWindow;
my $img = $haupt->Animation('-format' => 'gif', -file => 'icons/sc_7.gif');
my $label = $haupt->Label(-image=>$img)->pack;
$img->blank(1);

$scale = $haupt->Scale(-from => 0, -to => $#{$img->{'_frames_'}}, -orient => "horizontal", -command =>sub { $img->set_image( $scale->get ); } )->pack();

MainLoop();

Ich konnte das Problem mit einer eigenen Animation nachvollziehen (X11 + perl5.8.7, sein System war Windows).

Das Problem scheint am unglücklichen Zusammenspiel zwischen ->blank und ->copy in der Methode Tk::Animation::set_image zu liegen.

Ein Workaround wäre, die Animation selbst vorzunehmen, zum Beispiel so:
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
use strict;
use Tk;

my $scale;
my $haupt = new MainWindow;
my @img;
for my $i (0 .. 1000) {
    my $img;
    eval {
        $img = $haupt->Photo(-file => "anim.gif", -format=> "gif -index $i");
    };
    if (!$@) {
        push @img, $img;
    } else {
        last;
    }
}

my $img_i = 0;
my $label = $haupt->Label(-image=>$img[$img_i])->pack;
$label->repeat(100, sub {
               
    $img_i++;
               
    if ($img_i > $#img) { $img_i = 0 }
               
    $label->configure(-image => $img[$img_i]);
               });
               
    

MainLoop();


Eine andere Möglichkeit wäre, die Zeile
Code: (dl )
$obj->copy($frames->[$index]);
aus Tk::Animation::set_image durch
Code: (dl )
$obj->put($frames->[$index]->data(-background => "#dddddd"))
zu ersetzen. Nachteil: die Transparenz geht dabei verloren.
renee
 2005-12-28 09:09
#45149 #45149
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das Problem liegt glaube ich woanders... Das Bild, das Du mit -file angibst, wird nicht in die Liste der Frames übernommen...

Dadurch wird bei set_image gar nichts gemacht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-12-28 09:13
#45150 #45150
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Folgendes sollte funktionieren:
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
#!/usr/bin/perl

use strict;
use warnings;
use Tk;
use Tk::Animation;
use Tk::Photo;

my $scale;
my $haupt = new MainWindow;
my $img = $haupt->Animation('-format' => 'gif', -file => './icons/archiv.gif');
my $image = $haupt->Photo('-format' => 'gif', -file => './icons/top.gif');
my $image2 = $haupt->Photo('-format' => 'gif', -file => './icons/edit.gif');
$img->add_frame($image);
$img->add_frame($image2);
my $label = $haupt->Label(-image=>$img)->pack;
$img->add_label($label);
$img->blank(1);

$scale = $haupt->Scale(-from => 0, -to => $#{$img->{'_frames_'}},
-orient => "horizontal",
-command =>sub { $img->set_image( $scale->get ); } )->pack();

MainLoop();


Und meine geänderte Animation.pm nur Änderungen:
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
sub new{
my ($class,$widget,%args) = @_;
my $obj = $class->SUPER::new($widget,%args);
$obj->{'_MainWIndow_'} = $widget->MainWindow;
if ($args{'-format'} eq 'gif'){
my @images;
$obj->add_frame($class->SUPER::new($widget,%args));
}
$obj->set_image( 0 );
$obj->{_delta_} = 1;
$obj->{_blank_} = 0;
return $obj;
}

sub set_image{
my ($obj,$index) = @_;
my $frames = $obj->{'_frames_'};
return unless $frames && scalar(@$frames)>0;
$obj->clear_label();
$index = 0 unless $index < @$frames;
$obj->blank if $obj->{_blank_}; # helps some make others worse
$obj->copy($frames->[$index]);
$obj->{label}->configure(-image => $frames->[$index]) if(defined $obj->{label});
$obj->{'_frame_index_'} = $index;
}

sub add_label{
my ($obj,$label) = @_;
$obj->{label} = $label if defined $label;
}

sub clear_label{
my ($obj) = @_;
if(defined $obj->{label}){
$obj->{label}->configure(-image => '');
}
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2005-12-28 12:04
#45151 #45151
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Doch, mit Tk::Animation::new() wird das GIF auseinander genommen und die einzelnen Frames in @{$self->{_frames_}} eingetragen. set_image() macht schon was, aber leider bleibt das letzte Bild (wegen der Transparenz oder der Disposal-methode) sichtbar.

Deine Lösung mit add_label hat das Problem, dass es nur mit Animationen funktioniert, die in ein Label eingebettet werden. Man kann Animationen aber überall verwenden, z.B. innerhalb eines Text-, Canvas- oder Menu-Widgets.
esskar
 2005-12-28 12:07
#45152 #45152
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=ptk,28.12.2005, 11:04]aber leider bleibt das letzte Bild (wegen der Transparenz oder der Disposal-methode) sichtbar.[/quote]
ist letzte bild=n-te Bild bei n Bildern im Gif oder das i-1-te Bild
ptk
 2005-12-28 12:19
#45153 #45153
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
i-1
renee
 2005-12-28 14:58
#45154 #45154
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: Ich habe mir einen Dump ausgeben lassen und da war bei Deinem Snippet nichts in $obj->{'_frames_'}...

Ich benutze Tk 804.027 und ActivePerl 5.8.6

Ich werde mich morgen mal naeher damit beschaeftigen. Vielleicht gibt es ja doch einen Weg, das Problem zu loesen... ;)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2005-12-28 19:07
#45155 #45155
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bei mir ist es gefüllt (Tk804.027 unter Unix):
Code: (dl )
Data::Dumper->new([$img->{_frames_}],[qw()])->Indent(1)->Useqq(1)->Dump
erhalte ich
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$VAR1 = [
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' ),
bless( {}, 'Tk::Animation' )
];
Vielleicht liegt es an verschiedenen animierten GIFs?
<< >> 8 Einträge, 1 Seite



View all threads created 2005-12-28 03:05.