2017-09-13 1 views
1

Ich entwickle einen Desktop-Client mit Perl Tk Modul. Ich habe eine Schaltfläche, die das Verzeichnis für die jeweilige Aufgabe öffnet. Aber das Problem, mit dem ich konfrontiert bin, ist, dass es meine Perl-Schnittstelle schließt, die ich nicht möchte.Perl Tk Fenster autoclosing auf Browsing-Verzeichnis

Unten ist die Unter, die die Logik für ein Verzeichnis geöffnet implementiert:

sub open_directory { 
    my $directory = shift; 
    print "comes here atleast for $directory"; 
    if ($^O eq 'MSWin32') { 
    exec "start $directory"; 
    } 
    else { 
    die "cannot open folder on your system: $^O"; 
    } 
} 

ich dieses Unter über nenne:

sub second_window{ 

    my $row = 0; 
    $mw2 = new MainWindow; 

    #Loop for listing taskname,path and browse button for all tasks of a region 
    for my $i(1..$#tasks_region_wise){ 
     $row = $row+1; 
     $frame_table-> Label(-text=>$sno+$i,-font=>"calibri")->grid(-row=>$row,-column=>0,-sticky=>'w'); 
     $frame_table-> Label(-text=>$tasks_region_wise[$i][2],-font=>"calibri")->grid(-row=>$row,-column=>1,-sticky=>'w'); 
     $frame_table-> Label(-text=>$tasks_region_wise[$i][3],-font=>"calibri")->grid(-row=>$row,-column=>2,-sticky=>'w'); 


#Calling that sub in the below line: 

     $frame_table->Button(-text => 'Browse',-relief =>'raised',-font=>"calibri",-command => [\&open_directory, $tasks_region_wise[$i][3]],-activebackground=>'green',)->grid(-row=>$row,-column=>3); 
     $frame_table->Button(-text => 'Execute',-relief =>'raised',-font=>"calibri",-command => [\&open_directory, $tasks_region_wise[$i][4]],-activebackground=>'green',)->grid(-row=>$row,-column=>4); 
     $frame_table->Button(-text => 'Detail',-relief =>'raised',-font=>"calibri",-command => [\&popupBox, $tasks_region_wise[$i][2],$tasks_region_wise[$i][5]],-activebackground=>'green',)->grid(-row=>$row,-column=>5); 

    } 
    $frame_table->Label()->grid(-row=>++$row); 
    $frame_table->Button(-text => 'Back',-relief =>'raised',-font=>"calibri",-command => \&back,-activebackground=>'green',)->grid(-row=>++$row,-columnspan=>4); 

    MainLoop; 
} 

Es öffnet sich das Datei-Explorer-Fenster richtig, aber schließt die Perl-Schnittstelle.

+0

ich glaube, das Problem ist die 'exec' Aufruf, die Ihre laufenden ausführbar durch einen neuen ersetzen. – ulix

+0

Danke für diesen Punkt @ulix, ich habe die Problemumgehung dafür durch Verwendung der Systemfunktion anstelle des Exec-Aufrufs. – Mohit

Antwort

2

Posting für zukünftige Referenz auf jeden, der mit diesem Problem konfrontiert ist. Ich habe gerade das richtige Problem, wie von einem anderen Stackoverflow-Benutzer @ulix kommentiert.

Problem: Das Problem hier war, dass der Exec-Aufruf diese aktuelle Ausführung des Skripts zu stoppen und den Start-Verzeichnis-Befehl ausgeführt wurde.

Lösung: Konvertieren Sie den Exec-Aufruf zu Systemaufruf, der die Exec nicht auslöst und stattdessen von Perl behandelt wird.

PFB der aktualisierte Code des Unter:

sub open_directory { 
    my $directory = shift; 
    print "comes here atleast for $directory"; 
    if ($^O eq 'MSWin32') { 
    system("start $directory"); 
    } 
    else { 
    die "cannot open folder on your system: $^O"; 
    } 
} 
Verwandte Themen