免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1974 | 回复: 2

用perl/Tk简单写了一个在线PC检测工具,一处故障求斧正。 [复制链接]

论坛徽章:
0
发表于 2012-12-11 22:13 |显示全部楼层
本帖最后由 mouse.rice 于 2012-12-11 22:20 编辑
  1. use strict;
  2. use Tk;
  3. use Tk::StrfClock;
  4. use Sys::Hostname;
  5. use Net::Ping;
  6. use Socket;

  7. use encoding("gbk");

  8. my $subnet;
  9. my $sub;

  10. #定义主窗口
  11. my $mw = MainWindow->new;
  12. $mw->geometry("300x420");
  13. $mw->title("随便写点啥");

  14. #定义按钮及菜单
  15. my $main_menu = $mw->Menu();
  16. $mw->configure(-menu => $main_menu);

  17. my $main_frame = $mw->Frame()
  18.                     ->pack(-side => 'top', -fill => 'x');

  19. my $file_menu = $main_menu->cascade(-label=>"文件", -tearoff=>0);
  20. $file_menu->command(-label=>"退出", -command=>sub{exit});


  21. my $tool_menu = $main_menu->cascade(-label=>"工具", -tearoff=>0);

  22. $tool_menu->command(-label=>"自定义扫描网段", -command=>\&fill_subnet);

  23. my $look_menu = $main_menu->cascade(-label=>"查看", -tearoff=>0);
  24. $look_menu->command(-label=>"日志", -command=>\&log);


  25. my $help_menu = $main_menu->cascade(-label=>"帮助", -tearoff=>0);
  26. $help_menu->command(-label=>"使用说明", -command=>\&readme);

  27. #定义第二个frame,即当前时间显示栏
  28. my $frame_2 = $main_frame->Frame()
  29.                            ->pack(-side => 'right', -fill => 'x');

  30. $frame_2->StrfClock(-font=>"fixed 9 bold", -foreground=>'#128110')->pack();

  31. #定义滚动框
  32. my $frame_3 = $mw->Frame()
  33.    ->pack(-side => 'top', -ipady=>'0.1', -fill => 'x');

  34. my $t = $frame_3->Scrolled("Text",
  35.                          -scrollbars => 'oe',  
  36.                               -width  => 40,
  37.                              -height  => 22,
  38.                                -wrap  => 'none',
  39.                     )
  40.                 ->pack(-side => 'top', -expand => 1);


  41. $mw->Frame(-background => "blue")
  42.       ->pack(-side => 'top', -ipady=>'0.5', -fill => 'x');

  43. #定义最下面一个frame,版权说明
  44. $mw->Label(-text => "推广开源  Perl/Tk开发\n-------------------------\n联系人:XXX\tQQ: 11111111", -font=>"fixed 9")
  45.    ->pack(-side => "bottom");

  46. MainLoop;

  47. sub fill_subnet
  48.         {
  49.                 use Tk::DialogBox;
  50.                 use Tk::LabEntry;
  51.                 my $db = $mw->DialogBox(-title => "填写并扫描网段", -buttons => ["确定扫描", "放弃重置"], -command => \&scan_subnet);
  52.                 $db->add('LabEntry', -textvariable => \$subnet, -width => 20, -background => 'white', -foreground => 'blue',
  53.                                          -label => "网段", -labelPack => [-side => 'left'])
  54.                    ->pack;
  55.                 my $answer = $db->Show( );
  56.         }

  57. sub scan_subnet
  58.         {

  59.        my @host;
  60.            my @subnet = (split "," , $subnet);
  61.            foreach my $sub (@subnet) {
  62.                for my $ip_range (1..3) {#测试而已,暂且数据写小一点,貌似写1 .. 254卡死了...
  63.                        my $ips = "192.168.$sub.$ip_range";
  64.                        push @host, $ips;
  65.                }
  66.        }

  67.        foreach my $host (@host){
  68.            my $p = Net::Ping->new("icmp");

  69.            if ($p->ping($host,0.1)){
  70.                
  71.                my $hostname = gethostbyaddr(inet_aton($host),AF_INET);
  72.                $hostname ||= '?';#如未成功获取,则设置主机名为?
  73.                $t->repeat(1000, sub {$t->insert('end', "$host => $hostname is On_line\n")});
  74.             }else{     
  75.                $t->repeat(1000, sub {$t->insert('end', "$host is offline\n")});
  76.            }
  77.            $p->close();
  78.        }
  79.     }
复制代码
随手写了一个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 实时显示数据,滚动条随数据增加而变化的同时,光标总是显示在出现的最后一个字符。而我上面的程序需要手动拉滚动框才能显示最后一行数据。

论坛徽章:
0
发表于 2012-12-12 17:21 |显示全部楼层
不顶要沉了,兄弟姐们们赐教啊。感谢!

论坛徽章:
0
发表于 2012-12-14 13:35 |显示全部楼层
有解惑的兄弟没
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP