Самый простой способ - вызвать $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
.