RE: Drag-n-Drop in Perl/Tkx

[email protected] ("Swingle David-QWHM86")
Newsgroups perl.tcltk
Message-ID <[email protected]>
With some help from www.perlmonks.org
<BLOCKED::http://www.perlmonks.org> , I have the following.  It handles
the drag part of a widget in the window, but the drop part doesn't do
anything.  I ultimately want to be able to drag a file from windows
explorer and have the filename (and path) recognized in the widget.
Can't get 'drop' to work in Perl/Tkx.  Any help would be appreciated.
 
Dave
 
________________________________

#!/usr/bin/perl --
use strict;
use warnings;
use Tkx;
 
my $text = "abc";
 
Main(@ARGV);
exit(0);
 
sub Main {
  local $Tkx::TRACE = 64;
  Tkx::package_require('tile');
  Tkx::package_require('BWidget');
  eval      { Tkx::tile__setTheme('xpnative'); 1 }
    || eval { Tkx::ttk__setTheme('xpnative');  1 };
  drawGUI();
  Tkx::MainLoop();
}
 
sub drawGUI
{
    our $t = Tkx::widget->new(".");
    $t->g_wm_title("BWidgets Demo for Drag 'n Drop enabled buttons.");
 
    $t = $t->new_ttk__frame( -name => '.f' );
    $t->g_pack(qw '-fill both -expand true');
 
    for my $i ( 1 .. 4 )
    {
        my $m  = (qw' 0 Drag and Drop Demo ')[$i];
        my $bb = $t->new_ttk__button(-name => "$t.b$i",    # auto-name
is .b .b2 .b3...
                                     -image => Tkx::Bitmap__get( (qw'0
new file copy redo ')[$i] ),
                                     -text  => "$i.) $m",
                                     -command => sub { print "$m\n"; });
        $bb->g_pack;
    }
 
    enableDnD( map { "$t.b$_" } 1 .. 4 );
 
    $t->new_ttk__button(-text => "Exit Demo",
                        -command => [ \&Tkx::destroy, '.' ])->g_pack(qw
'-padx 5 -pady 5');
 
    my $entry = $t->new_ttk__entry(-width => 20, -textvariable =>
\$text);
    Tkx::DropSite__register($entry,
                            -dropcmd => \&dropcmdEntry,
                            -dropovercmd => \&dropovercmdEntry,
                            -droptypes => {"text", {"copy", "none"}});
    $entry->g_pack(qw '-padx 5 -pady 5');
}
 
sub enableDnD
{
    for my $w (@_)
    {
        Tkx::DropSite__register($w,
                                -dropcmd => \&dropButtonCmd);
        Tkx::DragSite__register($w,
                                -dragevent => 1,
                                -draginitcmd => \&dragInitCmd,
                                -dragendcmd => \&dragEndCmd);
    }
}
 

sub dropButtonCmd
{
    my @args = (@_);
 
    print "in dropButtonCmd\n";
    for (my $i = 0; $i < scalar @args; $i++)
    {
        print "arg $i = '$args[$i]'\n"  if defined $args[$i];
    }
    return "abc";
}
 
sub dragInitCmd
{
    my @args = (@_);
 
    print "in dragInitCmd\n";
    for (my $i = 0; $i < scalar @args; $i++)
    {
        print "arg $i = '$args[$i]'\n"  if defined $args[$i];
    }
    my $data = "\"Button " . $args[3] . "\"";
    return ("text", ("copy"), $data);
}
 
sub dragEndCmd
{
    my @args = (@_);
 
    print "in dragEndCmd\n";
    for (my $i = 0; $i < scalar @args; $i++)
    {
        print "arg $i = '$args[$i]'\n"  if defined $args[$i];
    }
}
 
sub dropcmdEntry
{
    print "dropcmdEntry\n";
    return "entry";
}
 
sub dropovercmdEntry
{
    print "dropovercmdEntry\n";
}

________________________________

 
When I run the script and drag one of the buttons around, I get
something like the following, but I can't seem to get the drop commands
to ever fire.
 
Tkx-1-0.0s-dnd2.pl-13: package require tile
Tkx-2-0.1s-dnd2.pl-14: package require BWidget
Tkx-3-0.1s-dnd2.pl-15: tile::setTheme xpnative
Tkx-4-0.1s-dnd2.pl-24: wm title . {BWidgets Demo for Drag 'n Drop
enabled buttons.}
Tkx-5-0.1s-dnd2.pl-26: ttk::frame .f
Tkx-6-0.1s-dnd2.pl-27: pack .f -fill both -expand true
Tkx-7-0.1s-dnd2.pl-35: Bitmap::get new
Tkx-8-0.1s-dnd2.pl-35: ttk::button .f.b1 -image image1 -text {1.) Drag}
-command perl::callback
Tkx-9-0.1s-dnd2.pl-36: pack .f.b1
Tkx-10-0.1s-dnd2.pl-35: Bitmap::get file
Tkx-11-0.1s-dnd2.pl-35: ttk::button .f.b2 -image image2 -text {2.) and}
-command perl::callback
Tkx-12-0.1s-dnd2.pl-36: pack .f.b2
Tkx-13-0.1s-dnd2.pl-35: Bitmap::get copy
Tkx-14-0.1s-dnd2.pl-35: ttk::button .f.b3 -image image3 -text {3.) Drop}
-command perl::callback
Tkx-15-0.1s-dnd2.pl-36: pack .f.b3
Tkx-16-0.1s-dnd2.pl-35: Bitmap::get redo
Tkx-17-0.1s-dnd2.pl-35: ttk::button .f.b4 -image image4 -text {4.) Demo}
-command perl::callback
Tkx-18-0.1s-dnd2.pl-36: pack .f.b4
Tkx-19-0.1s-dnd2.pl-56: DropSite::register .f.b1 -dropcmd perl::callback
Tkx-20-0.1s-dnd2.pl-58: DragSite::register .f.b1 -dragevent 1
-draginitcmd perl::callback -dragendcmd perl::callback
Tkx-21-0.1s-dnd2.pl-56: DropSite::register .f.b2 -dropcmd perl::callback
Tkx-22-0.1s-dnd2.pl-58: DragSite::register .f.b2 -dragevent 1
-draginitcmd perl::callback -dragendcmd perl::callback
Tkx-23-0.2s-dnd2.pl-56: DropSite::register .f.b3 -dropcmd perl::callback
Tkx-24-0.2s-dnd2.pl-58: DragSite::register .f.b3 -dragevent 1
-draginitcmd perl::callback -dragendcmd perl::callback
Tkx-25-0.2s-dnd2.pl-56: DropSite::register .f.b4 -dropcmd perl::callback
Tkx-26-0.2s-dnd2.pl-58: DragSite::register .f.b4 -dragevent 1
-draginitcmd perl::callback -dragendcmd perl::callback
Tkx-27-0.2s-dnd2.pl-41: winfo children .f
Tkx-28-0.2s-dnd2.pl-41: ttk::button .f.b -text {Exit Demo} -command
perl::callback
Tkx-29-0.2s-dnd2.pl-41: pack .f.b -padx 5 -pady 5
Tkx-30-0.2s-dnd2.pl-44: winfo children .f
Tkx-31-0.2s-dnd2.pl-44: ttk::entry .f.e -width 20 -textvariable
SCALAR(0x1830104)
Tkx-32-0.2s-dnd2.pl-45: DropSite::register .f.e -dropcmd perl::callback
-dropovercmd perl::callback -droptypes HASH(0x1b1e38c)
Tkx-33-0.2s-dnd2.pl-49: pack .f.e -padx 5 -pady 5
in dragInitCmd
arg 1 = 'Tcl=SCALAR(0x189f2fc)'
arg 2 = '::perl::CODE(0x18c6bb8)'
arg 3 = '.f.b1'
arg 4 = '181'
arg 5 = '145'
arg 6 = '.drag'
in dragEndCmd
arg 1 = 'Tcl=SCALAR(0x189f2fc)'
arg 2 = '::perl::CODE(0x18c6cb4)'
arg 3 = '.f.b1'
arg 4 = ''
arg 5 = ''
arg 6 = 'Button .f.b1'
arg 7 = ''
arg 8 = '0'
 

________________________________

From: Swingle David-QWHM86 
Sent: Tuesday, January 26, 2010 12:46 PM
To: '[email protected]'
Subject: Drag-n-Drop in Perl/Tkx


I'm converting Perl/Tk to Perl/Tkx and I'm struggling with getting Drag
and Drop to work in Perl/Tkx.  I had found help for DND in Perl/Tk and
use in in a large script I wrote, but for simplicity, here is a simple
Perl/Tk script that supports DND:
 
use strict;
use Tk;
use Tk::Pane;
 
my $textVariable = "my text";
 
my $mw = MainWindow->new;
my $frame = $mw->Frame()->pack(-side => 'top', -expand => 1, -fill =>
'x');
$frame->Label(-text => "My Label",
              -anchor => 'w',
              -width => 10)->pack(-ipady => 1,
                                  -side => 'left');
my $entry = $frame->Entry(-textvariable => \$textVariable,
                          -width => 40)->pack(-side => 'left');
$frame->DropSite(-dropcommand => [\&AcceptDrop, $frame],
                 -droptypes => ('Win32'));
 
MainLoop;
 

sub AcceptDrop
{
    my ($widget, $selection) = @_;
    my $filename;
 
    $filename = $widget->SelectionGet(-selection => $selection,
'STRING');
    $textVariable = $filename;
}

 
Is there an easy way to convert this simple script to use Tkx?  I know
there was a post about this in the past, but I couldn't figure out
exactly what was meant.  For example, in that post there was
 
    $interp->packageRequire('tkdnd', '2.0');
 
But $interp wasn't initialized to anything.
 
I'm using perl, v5.8.8, binary build 822.
 
Thanks,
David
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.