2017-08-11 91 views
1

我有一個Pertl Tk代碼,我想關閉主窗口並打開另一個窗口,但第一個窗口在第二個窗口打開後再次關閉時,第一個窗口也會出現。在Tk中銷燬Widget不工作

代碼

use strict; 
use Tk; 

my $mw; 

#Calling the welcome_window sub 
welcome_window(); 

sub welcome_window{ 

    #GUI Building Area 
    $mw = new MainWindow; 

    my $frame_header = $mw->Frame(); 
    my $header = $frame_header -> Label(-text=>"Molex Automation Tool"); 
    $frame_header -> grid(-row=>1,-column=>1); 
    $header -> grid(-row=>1,-column=>1); 

    my $region_selected = qw/AME APN APS/; 

    my $frame_sub_header = $mw->Frame(); 
    my $sub_header = $frame_sub_header -> Label(-text=>"Region Selection"); 
    $frame_sub_header -> grid(-row=>2,-column=>1); 
    $sub_header -> grid(-row=>2,-column=>1); 


    my $frame_region = $mw->Frame(); 
    my $label_region = $frame_region -> Label(-text=>"Region:"); 
    my $region_options = $frame_region->Optionmenu(
     -textvariable => \$region_selected, 
     -options => [@regions], 
    ); 
    $frame_region -> grid(-row=>3,-column=>1); 
    $label_region -> grid(-row=>3,-column=>1); 
    $region_options -> grid(-row=>3,-column=>2); 

    my $frame_submit = $mw->Frame(); 
    my $submit_button = $frame_submit->Button(-text => 'Go!', 
        -command => \&outside, 
      ); 
    $frame_submit -> grid(-row=>4,-column=>1,-columnspan=>2); 
    $submit_button -> grid(-row=>4,-column=>1,-columnspan=>2); 

    MainLoop; 
} 

#This sub is just made to close the main window created in Welcome_Wiondow() sub and call the second_window() 

sub outside{ 

    $mw -> destroy; 
    sleep(5); 
    second_window(); 
} 


sub second_window{ 

    my $mw2 = new MainWindow; 
    my $frame_header2 = $mw2->Frame(); 
    my $header2 = $frame_header2 -> Label(-text=>"Molex Automation Tool"); 
    $frame_header2 -> grid(-row=>1,-column=>1); 
    $header2 -> grid(-row=>1,-column=>1); 

    my $frame_sub_header2 = $mw2->Frame(); 
    my $sub_header2 = $frame_sub_header2 -> Label(-text=>"Tasks Region Wise"); 
    $frame_sub_header2 -> grid(-row=>2,-column=>1); 
    $sub_header2 -> grid(-row=>2,-column=>1); 

    MainLoop; 
} 

我減少了代碼,並只放了相關線路。現在請讓我知道爲什麼我不能殺掉在sub outside()中的子welcome_window()中打開的主窗口。目前它在睡眠命令期間會關閉主窗口,但只要打開second_windows的主窗口,welcome_window的窗口也會再次出現。

得到了上面的代碼現在工作,邏輯 有一些問題,再次調用welcome_window。謝謝大家對你的 幫助。

回答

2

您不能有多個MainWindow。創建初始的一個頂層窗口,使用withdraw隱藏在開始真正的主窗口,使其與deiconify重現:

my $mw = MainWindow->new; 
my $tl = $mw->Toplevel; 
$tl->protocol(WM_DELETE_WINDOW => sub { 
    $mw->deiconify; 
    $tl->DESTROY; 
}); 
$mw->withdraw; 
MainLoop(); 
+0

我可以從這個withdaw功能工作主循環外的()?目前我無法做到這一點。 – Mohit

+0

另外我還爲每個窗口分開了MainLoop?這是否有區別 – Mohit

+0

我不明白第一個問題。嘗試提出一個新問題,而不是評論。你可能有兩個MainLoops和兩個不同的MainWindow,只要確保在第一個循環結束之前不要定義第二個。 – choroba