[PERL] Problemen met sluiten van Sub

Pagina: 1
Acties:

  • XanderDrake
  • Registratie: November 2004
  • Laatst online: 29-04 23:41

XanderDrake

Build the future!

Topicstarter
Hey allen,

Ik was bezig met een bepaalt programma, en op een gegeven moment had ik een widget nodig, vanuit TK, om een soort van OpenDirDialog te geven. Dus in plaats van "selecteer bestand om te open", "selecteer map om bestand in te plaatsen". Voor zo ver ik wist, en kon vinden, was er nog niet zon widget in TK, dus ging ik er zelf maar eentje maken.

en als volgt
Perl:
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
use Tk;
use Tk::DirTree;
use Cwd;

my $top = new MainWindow;
$top->withdraw;

my $t = $top->Toplevel;
$t->title("Choose directory:");
my $ok = 0;

my $f = $t->Frame->pack(-fill => "x", -side => "bottom");

my $curr_dir = Cwd::cwd();

my $d;
$d = $t->Scrolled('DirTree',
          -scrollbars => 'osoe',
          -width => 35,
          -height => 20,
          -selectmode => 'browse',
          -exportselection => 1,
          -browsecmd => sub { $curr_dir = shift },

           -command   => sub { $ok = 1 },
            )->pack(-fill => "both", -expand => 1);

$d->chdir($curr_dir);

$f->Button(-text => 'Ok',
       -command => sub { $ok =  1 })->pack(-side => 'left');
$f->Button(-text => 'Cancel',
       -command => sub { $ok = -1 })->pack(-side => 'left');

$f->waitVariable(\$ok);

if ($ok == 1) {
    warn "de gekozen dir is: $curr_dir\n";
}

In "$curr_dir" komt uiteindelijk de path van de directory te staan, als je de gekozen map selecteert en OK klikt, of de map dubbelklikt. In de laatste if werkt het ook uitstekend, hij print gewoon de path uit. Het werkt dus gewoon, zoals het hoor, zodra $curr_dir is gereturned, sluit het scherm, en ben je klaar.

Deze zelfgemaakte widget wil ik dus gebruiken in mijn programma. Helaas mag ik in verband met mijn contract (ik werk als stagaire in het Erasmus MC => geheimhouding) de rest van dat programma niet laten zien.

Maar wat dus het probleem is; als ik deze widget als Sub gebruik in het programma dan krijg ik em maar niet dood! Als los stuk script sluit het scherm gewoon na het kies-event, maar in het grotere programma blijft het script, na het klikken van OK of Cancel of Dubbelklikken van de geselecteerde map, nog steeds draaien...

de volgende dingen heb ik geprobeerd in de laatste if of er direct na:

Ik heb "die" geprobeerd, met of zonder argument, maar dan krijg ik een foutmelding uitgeprint.
Ik heb $top -> close; geprobeerd, zelfde foutmelding.
ik heb $top -> withdraw; geprobeerd, dito.
undef $top; heeft geen enkel effect.
Als ik gewoon close; of __END__ gebruik, sterft het hele programma... en dat wil ik ook niet.


Foutmelding bij $top -> close;
code:
1
2
3
4
5
6
7
8
9
10
11
12
---------- Capture Output ----------
> "C:\perl\bin\perl.exe" ***geheimhouding***.pl
The resulting directory is: C:/progs/belangrijke scripts
Tk::Error: Failed to AUTOLOAD 'MainWindow::close' at GUI_P_value_hash.pl line 231
 Carp::croak at C:/Perl/lib/Carp.pm line 269
 Tk::Widget::__ANON__ at C:/Perl/site/lib/Tk/Widget.pm line 347
 main::dir_dialogue at ***geheimhouding***.pl line 231
 Tk callback for .button1
 Tk::__ANON__ at C:/Perl/site/lib/Tk.pm line 252
 Tk::Button::butUp at C:/Perl/site/lib/Tk/Button.pm line 111
 <ButtonRelease-1>
 (command bound to event)



Iemand een idee?

BVD dank _/-\o_

Hephaestus: Xeon 2680 v2 - 64GB ECC Quad - WD Blue 3D 1TB
Virtualis: Ryzen 3700X - 16GB DDR4 - Gigabyte 1080 Ti OC - Sandisk 2TB - Valve Index
Agon:Valve Steam Deck 64GB
Non scholae sed vitae discimus Seneca


  • XanderDrake
  • Registratie: November 2004
  • Laatst online: 29-04 23:41

XanderDrake

Build the future!

Topicstarter
Iemand?

Hephaestus: Xeon 2680 v2 - 64GB ECC Quad - WD Blue 3D 1TB
Virtualis: Ryzen 3700X - 16GB DDR4 - Gigabyte 1080 Ti OC - Sandisk 2TB - Valve Index
Agon:Valve Steam Deck 64GB
Non scholae sed vitae discimus Seneca