- 論壇徽章:
- 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=>"自定義掃描網(wǎng)段", -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,即當(dāng)前時間顯示欄
- 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,版權(quán)說明
- $mw->Label(-text => "推廣開源 Perl/Tk開發(fā)\n-------------------------\n聯(liá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 => "填寫并掃描網(wǎng)段", -buttons => ["確定掃描", "放棄重置"], -command => \&scan_subnet);
- $db->add('LabEntry', -textvariable => \$subnet, -width => 20, -background => 'white', -foreground => 'blue',
- -label => "網(wǎng)段", -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) {#測試而已,暫且數(shù)據(jù)寫小一點,貌似寫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 ||= '?';#如未成功獲取,則設(shè)置主機名為?
- $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();
- }
- }
復(fù)制代碼 隨手寫了一個TK小工具,用于檢測內(nèi)網(wǎng)在線PC(其他功能還沒有添加進去)。
1、用法:點“工具”-“自定義掃描網(wǎng)段”,填寫網(wǎng)段號(實際公司內(nèi)部網(wǎng)段全部是192.168.X.X,比如我要掃描192.168.1.x和192.168.2.x兩個網(wǎng)段PC,則彈出框網(wǎng)段填寫1,2 用逗號隔開,程序中是這么設(shè)定的),F(xiàn)在運行中出現(xiàn)一個問題:sub scan_subnet{..}這個子函數(shù)故障,其中foreach my $host(@host)成了無限循環(huán),停不下來(滾動框中不停循環(huán)出現(xiàn)insert的數(shù)據(jù))。不知道哪里出了問題,請各位幫斧正。看了一下午,頭都暈了,謝謝!
2、另外,還想實現(xiàn)一個功能:類似msdos下ping 192.168.1.1 -t 實時顯示數(shù)據(jù),滾動條隨數(shù)據(jù)增加而變化的同時,光標總是顯示在出現(xiàn)的最后一個字符。而我上面的程序需要手動拉滾動框才能顯示最后一行數(shù)據(jù)。
|
|