3

Perl/Tk スクリプトで、2 つのウィンドウを開きました。特定のボタンをクリックした後、そのうちの1つを閉じたいと思います。どうやってやるの?これが私がこれまでに持っているものです:

$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メソッドは、必要に応じて後で再表示できるように、ウィンドウを破棄せずに非表示にします。これにより、ボタンを押す時間を節約できます。クラスDialogDialogBoxは、ボタンの 1 つが押されると自動的にこれを行います。従来のダイアログのように動作するウィンドウが必要な場合は、独自のウィンドウを作成するよりもはるかに簡単なオプションを使用できます。

また、例外的な場合を除いて、 を複数回呼び出す必要はありません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();
}

ダイアログが必要ない場合は、2 番目のダイアログを作成するMainWindowToplevel、既存の に依存するウィンドウを作成するかを検討する必要がありますMainWindow。AToplevelは閉じられると自動的に閉じられ、もう一方が閉じられた後もMainWindow2 番目MainWindowは開いたままになりますMainWindow

于 2010-05-27T17:31:37.323 に答える