2011-08-12 13 views
3
#!/usr/local/bin/perl 
use Tk; 
# Main Window 
$mw = new MainWindow; 
$label = $mw -> Label(-text=>"Hello World") -> pack(); 
$button = $mw -> Button(-text => "Quit", 
       -command => sub { exit }) -> pack(); 
MainLoop; 

このコードでは、$buttonボタンを押すとプログラムが終了します。これはexitコマンドを実行するためです。ユーザーがボタンをクリックするとiptablesルール(iptables -F)がフラッシュされるようにコードを修正したいと思います。これどうやってするの?Perl-Tkでボタンウィジェットを使ってコマンドを実行する

私はこれを試してみました:

$button = $mw -> Button(-text => "Flush the rules", 
        -command => system (iptables -F)) -> pack(); 

なぜこの作業ではないのですか?私はそれのためのサブルーチンを作成する必要があります(その後、iptables -Fコマンドを書いてください)し、そのサブルーチンを呼び出しますか?上記のコードのように直接コマンドを置くことはできませんか?

答えて

2

ボタンを押したときに実行されるコード参照(コールバック)を指定する必要があるので、システムコールをsub { }に配置する必要があります。

あなたが書いたことは、ボタンが定義されている時点でsystem()の呼び出しであるため、system()からの戻り値をコールバックのコードリファレンスとして指定しています。 system()関数は、Buttonが定義されているときに呼び出され、押されたときには呼び出されません。

+0

@ System()関数は、Buttonが定義されているときに呼び出されます。 私はプログラムを実行すると、ルールが定義された時点でルールがフラッシュされることを意味します。 –

+0

私は[類似の質問](http://stackoverflow.com/q/5947681/734153)でした。 [この記事](http://stackoverflow.com/questions/2620461/do-i-always-have-to-provide-tkxs-command-argument-an-anonymous-subroutine#2622318)はMartinの説明を詳しく説明しています – kshenoy

関連する問題