在Perl-Tk中使用Button小部件执行命令

#!/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$button被按下时,它closures程序。 因为它执行退出命令。 我想修改代码,这样当用户点击button时,它将刷新iptables规则( iptables -F )。 我怎样才能做到这一点?

我试过这个:

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

为什么这不起作用? 我应该为它做一个子程序(然后在那里写iptables -F命令),然后调用这个子程序? 我不能像上面的代码那样直接input命令吗?

你需要指定一个代码引用 – 一个回调 – 当按钮被按下时,这个回调将被执行,所以是的,你应该把你的系统调用放在一个sub { }

你写的是在定义Button的时候调用system(),所以你需要指定system()的返回值作为回调的coderef–这是行不通的。 系统()函数将在Button被定义时被调用,而不是被按下时 – 这不是你想要的。