Just keep track of the cards somehow (easiest way is to create an object, cause all you have is photo id's ;D)
You can re-position photos, so no need to redraw.
Check out (crazyinsomniac) Re: Tk Canvas Animation, (crazyinsomniac) Re: Win32 Tk JPEG from memory problem, crazy tk xbm tingy, and Tk Rubberband Demo. Hopefully you'll pick up a few tips (at least enough to write what you want, imho of course).
You might also wanna read the Tk::Canvas pod.
Here is a ready to run example
Here is another one#!/usr/bin/perl -w use strict; use Tk; sub jump_it { my ($c, $thing) = @_; my ($old_x, $old_y) = $c->coords($thing); my $new_pos = $old_x == 10 ? 80 : 10; $c->coords($thing, $new_pos, $new_pos); } =head1 ORIGINAL C<slide_it> function sub slide_it { my ($c, $thing) = @_; for my $i (10..80) { $c->coords($thing, $i, $i); for (my $wait=20000; --$wait;){}; } } =cut sub slide_it # canvas, card { my ($c, $thing) = @_; $$c{__slide_for} = 80; $$c{__slide_count} = 0; $$c{__slide_timer} = $c->repeat(100, # miliseconds [ \&move_thing, $c, $thing, 2, # this many pixels X 2, # this many pixels Y ,] ,); } sub move_thing { my($c, $thing, $nX, $nY) = @_; if( $$c{__slide_count} > $$c{__slide_for} ) { $$c{__slide_timer}->cancel() } $$c{__slide_count}++; $c->move( $thing, #what? $nX, $nY, ,); } my $mw = MainWindow->new; my $c = $mw->Canvas(-relief => 'sunken', -bd => 2, -width => 200, -height => 200); #my $image = $c->Photo(-file => "cards/ah.gif"); my $image = $c->Photo( -data => q{ R0lGODdhJwA5APcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8EAgAGAgAIAgAK +AgAMAg AOAgAABAACBAAEBAAGBAAIBAAKBAAMBAAOBAAABgACBgAEBgAGBgAIBgAKBgAMBgAOBgAA +CAACCA AECAAGCAAICAAKCAAMCAAOCAAACgACCgAECgAGCgAICgAKCgAMCgAOCgAADAACDAAEDAAG +DAAIDA AKDAAMDAAODAAADgACDgAEDgAGDgAIDgAKDgAMDgAODgAAAAQCAAQEAAQGAAQIAAQKAAQM +AAQOAA QAAgQCAgQEAgQGAgQIAgQKAgQMAgQOAgQABAQCBAQEBAQGBAQIBAQKBAQMBAQOBAQABgQC +BgQEBg QGBgQIBgQKBgQMBgQOBgQACAQCCAQECAQGCAQICAQKCAQMCAQOCAQACgQCCgQECgQGCgQI +CgQKCg QMCgQOCgQADAQCDAQEDAQGDAQIDAQKDAQMDAQODAQADgQCDgQEDgQGDgQIDgQKDgQMDgQO +DgQAAA gCAAgEAAgGAAgIAAgKAAgMAAgOAAgAAggCAggEAggGAggIAggKAggMAggOAggABAgCBAgE +BAgGBA gIBAgKBAgMBAgOBAgABggCBggEBggGBggIBggKBggMBggOBggACAgCCAgECAgGCAgICAgK +CAgMCA gOCAgACggCCggECggGCggICggKCggMCggOCggADAgCDAgEDAgGDAgIDAgKDAgMDAgODAgA +DggCDg gEDggGDggIDggKDggMDggODggAAAwCAAwEAAwGAAwIAAwKAAwMAAwOAAwAAgwCAgwEAgwG +AgwIAg wKAgwMAgwOAgwABAwCBAwEBAwGBAwIBAwKBAwMBAwOBAwABgwCBgwEBgwGBgwIBgwKBgwM +BgwOBg wACAwCCAwECAwGCAwICAwKCAwMCAwOCAwACgwCCgwECgwGCgwICgwKCgwMCgwOCgwADAwC +DAwEDA wGDAwIDAwKDAwP/78KCgpICAgP8AAAD/AP//AAAA//8A/wD//////yH5BAAAAAAALAAAAA +AnADkA AAjDAP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypEmKAFICEK +lSpceW MDm2/AczJUaXK2vOvKizJs2VFYHqFOhzYs6YA3P+BCrRJlKaRJ8+PIozadSdEKkKxanVZt +aYXr0u dfnVp9ikWKeCRSjV4VC2ad1qTdi2oVm4ZMs6hVqwqF6yZ/2q/bn06tusULmOrWvX8MzDTR +0v3osS 7eS4TZmaPWsR8FiWnE+KHk26tOnTqFOrLhgQADs=}, -format => 'gif' ); my $card = $c->create('image', 10, 10, -anchor => 'nw', -image => $image); my $j_btn = $mw->Button(-text => 'Jump It', -command => [\&jump_it, $c, $card] ); my $s_btn = $mw->Button(-text => 'Slide It', -command => [\&slide_it, $c, $card] ); $j_btn->pack; $s_btn->pack; $c->pack; MainLoop; __END__
#!/usr/bin/perl -w use strict; use Tk; my $MW = MainWindow->new; my $c = $MW->Canvas(-relief => 'sunken', -bd => 2, -width => 200, -height => 200)->pack(); #my $image = $c->Photo(-file => "cards/ah.gif"); my $image = $c->Photo( -data => q{ R0lGODdhJwA5APcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8EAgAGAgAIAgAK +AgAMAg AOAgAABAACBAAEBAAGBAAIBAAKBAAMBAAOBAAABgACBgAEBgAGBgAIBgAKBgAMBgAOBgAA +CAACCA AECAAGCAAICAAKCAAMCAAOCAAACgACCgAECgAGCgAICgAKCgAMCgAOCgAADAACDAAEDAAG +DAAIDA AKDAAMDAAODAAADgACDgAEDgAGDgAIDgAKDgAMDgAODgAAAAQCAAQEAAQGAAQIAAQKAAQM +AAQOAA QAAgQCAgQEAgQGAgQIAgQKAgQMAgQOAgQABAQCBAQEBAQGBAQIBAQKBAQMBAQOBAQABgQC +BgQEBg QGBgQIBgQKBgQMBgQOBgQACAQCCAQECAQGCAQICAQKCAQMCAQOCAQACgQCCgQECgQGCgQI +CgQKCg QMCgQOCgQADAQCDAQEDAQGDAQIDAQKDAQMDAQODAQADgQCDgQEDgQGDgQIDgQKDgQMDgQO +DgQAAA gCAAgEAAgGAAgIAAgKAAgMAAgOAAgAAggCAggEAggGAggIAggKAggMAggOAggABAgCBAgE +BAgGBA gIBAgKBAgMBAgOBAgABggCBggEBggGBggIBggKBggMBggOBggACAgCCAgECAgGCAgICAgK +CAgMCA gOCAgACggCCggECggGCggICggKCggMCggOCggADAgCDAgEDAgGDAgIDAgKDAgMDAgODAgA +DggCDg gEDggGDggIDggKDggMDggODggAAAwCAAwEAAwGAAwIAAwKAAwMAAwOAAwAAgwCAgwEAgwG +AgwIAg wKAgwMAgwOAgwABAwCBAwEBAwGBAwIBAwKBAwMBAwOBAwABgwCBgwEBgwGBgwIBgwKBgwM +BgwOBg wACAwCCAwECAwGCAwICAwKCAwMCAwOCAwACgwCCgwECgwGCgwICgwKCgwMCgwOCgwADAwC +DAwEDA wGDAwIDAwKDAwP/78KCgpICAgP8AAAD/AP//AAAA//8A/wD//////yH5BAAAAAAALAAAAA +AnADkA AAjDAP8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypEmKAFICEK +lSpceW MDm2/AczJUaXK2vOvKizJs2VFYHqFOhzYs6YA3P+BCrRJlKaRJ8+PIozadSdEKkKxanVZt +aYXr0u dfnVp9ikWKeCRSjV4VC2ad1qTdi2oVm4ZMs6hVqwqF6yZ/2q/bn06tusULmOrWvX8MzDTR +0v3osS 7eS4TZmaPWsR8FiWnE+KHk26tOnTqFOrLhgQADs=}, -format => 'gif' ); ## CARD my $card = $c->create( 'image', 10, 10, -anchor => 'nw', -image => $image ); $image->bind( 'Tk::Canvas', '<ButtonPress-1>' => [\&DragOn, map{Ev($_)} qw{ x y s } ] ); $image->bind( 'Tk::Canvas', '<ButtonRelease-1>' => [\&DragOff, map{Ev($_)} qw{ x y s } ] ); MainLoop; sub DragOn { my( $C, $X, $Y, $S ) = @_; if( grep { $card eq $_ } $C->find('overlapping', $X, $Y, $X + 1 , $Y + 1 ) ) { $MW->bind( 'Tk::Canvas', '<Motion>' => [\&StickToMouse, map { Ev($_) } qw{ x y s } +] ); } } sub DragOff { my( $C, $X, $Y, $S ) = @_; $MW->bind( 'Tk::Canvas', '<Motion>' => undef, # essentially unbind ); } sub StickToMouse { my( $C, $X, $Y, $S ) = @_; $C->coords( $card, $X, $Y); } __END__
In reply to Re: Re: Dragging/Dropping images with Tk
by PodMaster
in thread Dragging/Dropping images with Tk
by dimmesdale
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |