在我的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;
}
答案 0 :(得分: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
窗口。
当Toplevel
关闭时MainWindow
将自动关闭,而另一个MainWindow
关闭后,MainWindow
将保持打开状态。