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;
}
4

1 回答 1

2

最简单的方法是调用$component_dialog->destroy按钮-command回调。这样做的缺点是,如果您想稍后重新显示窗口,则必须重新创建它。该withdraw方法将隐藏窗口而不破坏它,因此您可以在以后需要时重新显示它。这将在按下按钮时为您节省一些时间。当按下其中一个按钮时,这些课程会自动为您执行此Dialog操作。DialogBox如果您需要一个行为类似于传统对话框的窗口,他们可以使用比构建您自己的对话框更简单的选项。

此外,除非在不寻常的情况下,您不需要多次调用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. AToplevel在关闭时会自动MainWindow关闭,第二个MainWindow将在另一个关闭后保持打开状态MainWindow

于 2010-05-27T17:31:37.323 回答