2010-05-27 61 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方法是調用$component_dialog->destroy的按鈕-command回調。這有一個缺點,如果你想稍後重新顯示窗口,你必須重新創建它。 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或創建一個Toplevel窗口依賴於你現有的MainWindow你應該考慮的對話框。 A Toplevel將在MainWindow關閉時自動關閉,第二個MainWindow將在另一個MainWindow關閉後保持打開狀態。