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: 'tcltk@perl.org'
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

Reply via email to