Как я могу закрыть окно в Perl / Tk? - PullRequest
3 голосов
/ 27 мая 2010

В моем скрипте 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 голосов
/ 27 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...