- 论坛徽章:
- 0
|
本帖最后由 mouse.rice 于 2012-12-11 22:20 编辑
- use strict;
- use Tk;
- use Tk::StrfClock;
- use Sys::Hostname;
- use Net::Ping;
- use Socket;
- use encoding("gbk");
- my $subnet;
- my $sub;
- #定义主窗口
- my $mw = MainWindow->new;
- $mw->geometry("300x420");
- $mw->title("随便写点啥");
- #定义按钮及菜单
- my $main_menu = $mw->Menu();
- $mw->configure(-menu => $main_menu);
- my $main_frame = $mw->Frame()
- ->pack(-side => 'top', -fill => 'x');
- my $file_menu = $main_menu->cascade(-label=>"文件", -tearoff=>0);
- $file_menu->command(-label=>"退出", -command=>sub{exit});
- my $tool_menu = $main_menu->cascade(-label=>"工具", -tearoff=>0);
- $tool_menu->command(-label=>"自定义扫描网段", -command=>\&fill_subnet);
- my $look_menu = $main_menu->cascade(-label=>"查看", -tearoff=>0);
- $look_menu->command(-label=>"日志", -command=>\&log);
- my $help_menu = $main_menu->cascade(-label=>"帮助", -tearoff=>0);
- $help_menu->command(-label=>"使用说明", -command=>\&readme);
- #定义第二个frame,即当前时间显示栏
- my $frame_2 = $main_frame->Frame()
- ->pack(-side => 'right', -fill => 'x');
- $frame_2->StrfClock(-font=>"fixed 9 bold", -foreground=>'#128110')->pack();
- #定义滚动框
- my $frame_3 = $mw->Frame()
- ->pack(-side => 'top', -ipady=>'0.1', -fill => 'x');
- my $t = $frame_3->Scrolled("Text",
- -scrollbars => 'oe',
- -width => 40,
- -height => 22,
- -wrap => 'none',
- )
- ->pack(-side => 'top', -expand => 1);
- $mw->Frame(-background => "blue")
- ->pack(-side => 'top', -ipady=>'0.5', -fill => 'x');
- #定义最下面一个frame,版权说明
- $mw->Label(-text => "推广开源 Perl/Tk开发\n-------------------------\n联系人:XXX\tQQ: 11111111", -font=>"fixed 9")
- ->pack(-side => "bottom");
- MainLoop;
- sub fill_subnet
- {
- use Tk::DialogBox;
- use Tk::LabEntry;
- my $db = $mw->DialogBox(-title => "填写并扫描网段", -buttons => ["确定扫描", "放弃重置"], -command => \&scan_subnet);
- $db->add('LabEntry', -textvariable => \$subnet, -width => 20, -background => 'white', -foreground => 'blue',
- -label => "网段", -labelPack => [-side => 'left'])
- ->pack;
- my $answer = $db->Show( );
- }
-
- sub scan_subnet
- {
- my @host;
- my @subnet = (split "," , $subnet);
- foreach my $sub (@subnet) {
- for my $ip_range (1..3) {#测试而已,暂且数据写小一点,貌似写1 .. 254卡死了...
- my $ips = "192.168.$sub.$ip_range";
- push @host, $ips;
- }
- }
- foreach my $host (@host){
- my $p = Net::Ping->new("icmp");
- if ($p->ping($host,0.1)){
-
- my $hostname = gethostbyaddr(inet_aton($host),AF_INET);
- $hostname ||= '?';#如未成功获取,则设置主机名为?
- $t->repeat(1000, sub {$t->insert('end', "$host => $hostname is On_line\n")});
- }else{
- $t->repeat(1000, sub {$t->insert('end', "$host is offline\n")});
- }
- $p->close();
- }
- }
复制代码 随手写了一个TK小工具,用于检测内网在线PC(其他功能还没有添加进去)。
1、用法:点“工具”-“自定义扫描网段”,填写网段号(实际公司内部网段全部是192.168.X.X,比如我要扫描192.168.1.x和192.168.2.x两个网段PC,则弹出框网段填写1,2 用逗号隔开,程序中是这么设定的)。现在运行中出现一个问题:sub scan_subnet{..}这个子函数故障,其中foreach my $host(@host)成了无限循环,停不下来(滚动框中不停循环出现insert的数据)。不知道哪里出了问题,请各位帮斧正。看了一下午,头都晕了,谢谢!
2、另外,还想实现一个功能:类似msdos下ping 192.168.1.1 -t 实时显示数据,滚动条随数据增加而变化的同时,光标总是显示在出现的最后一个字符。而我上面的程序需要手动拉滚动框才能显示最后一行数据。
|
|