如何在Perl/Tk中关闭窗口?

3

在我的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;
}
1个回答

2
最简单的方法是在按钮的 -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或者创建一个依赖于现有MainWindowToplevel窗口。 Toplevel将在其MainWindow关闭时自动关闭,而第二个MainWindow将在另一个MainWindow关闭后继续保持打开状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接