2010-05-27 7 views
3

내 Perl/Tk 스크립트에서 두 개의 창을 열었습니다. 특정 단추를 클릭 한 후 해당 단추 중 하나를 닫으려고합니다. 어떻게해야합니까? 여기에 지금까지이 작업은 다음과 같습니다Perl/Tk에서 창을 닫으려면 어떻게해야합니까?

$main = new MainWindow; 
$sidebar = $main->Frame(-relief => "raised", 
         -borderwidth => 2) 
       ->pack (-side=>"left" , 
         -anchor => "nw", 
         -fill => "y"); 
$Button1 = $sidebar -> Button (-text=>"Open\nNetlist", 
           -command=> \&GUI_OPEN_NETLIST) 
        ->pack(-fill=>"x"); 
MainLoop; 

sub GUI_OPEN_NETLIST 
{ 
    $component_dialog = new MainWindow; 
    $Button = $component_dialog -> Button (-text=>"Open\nNetlist", 
              -command=> **close new window**) 
           ->pack(-fill=>"x"); 
    MainLoop; 
} 

답변

2

simplist 방법은 -command 콜백 버튼에 $component_dialog->destroy를 호출하는 것입니다. 창을 다시 표시하려면 나중에 창을 다시 만들어야한다는 단점이 있습니다. withdraw 메서드는 창을 손상시키지 않고 숨기므로 나중에 필요할 때 다시 표시 할 수 있습니다. 이렇게하면 버튼을 눌렀을 때 시간을 절약 할 수 있습니다. DialogDialogBox 클래스는 버튼 중 하나를 누르면 자동으로이 작업을 수행합니다. 전통적인 대화처럼 작동하는 창이 필요하다면 훨씬 간단한 옵션으로 직접 만들 수 있습니다.

예외적 인 경우를 제외하고는 MainLoop에 두 번 이상 전화를하지 않아도됩니다. 콜백 GUI_OPEN_NETLIST가 MainLoop을 반환하면 명시 적으로 MainLoop을 호출하면 나중에 이상한 버그가 발생할 수 있습니다.

나는 이것이 당신이 찾고있는 것에 가깝다고 생각하는데, 나는 그것을 테스트하지 않았다.

use strict; 
use warnings; 

my $main = new MainWindow; 
my $sidebar = $main->Frame(-relief => "raised", 
         -borderwidth => 2) 
       ->pack (-side=>"left" , 
         -anchor => "nw", 
         -fill => "y"); 
my $Button1 = $sidebar -> Button (-text=>"Open\nNetlist", 
           -command=> \&GUI_OPEN_NETLIST) 
        ->pack(-fill=>"x"); 
my $component_dialog = $main->Dialog(-buttons => [ 'Close' ],); 

MainLoop; 

sub GUI_OPEN_NETLIST 
{ 
    $component_dialog->Show(); 
} 

당신이 두 번째 MainWindow를 만들거나이 MainWindow 기존에 의존 Toplevel 창을 만들려면 고려해야 대화를하지 않으려면. ToplevelMainWindow이 닫혀있을 때 자동으로 닫히고, 다른 하나는 MainWindow이 닫히면 두 번째 MainWindow이 계속 열려 있습니다.

관련 문제