python开发ping工具

这篇博客介绍了作者使用Python和wxpython库开发ping工具的过程。作者提到,由于原先的ping工具在Win7系统下存在一些问题,于是决定利用自学的Python知识进行实践。虽然小程序已实现基本功能,但存在一些不足,如未处理好弹窗提醒的关闭问题以及代码重构的需求。文章附带了源码。
摘要由CSDN通过智能技术生成

因之前用的ping网络服务的工具,有些功能在win7下不太好用。去年刚好自学了python,想练下手,因此就用了wxpython开发了ping小程序。如下:

小程序主界面:
在这里插入图片描述
在这里插入图片描述
不好的地方:

  1. 如果弹窗提醒忘了关闭,就直接关掉主程序会报错。暂时还没能力做到关闭主程序的同时销毁报弹窗提醒窗口。
  2. 不会代码重构,所以重复代码较多。

源码:

# -*- coding: utf-8 -*- 

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
## BY KXHuang 2018-11-05
## Version 1.0
###########################################################################

import wx
import wx.xrc
import configparser
# 保存配置文件必须导入
import time,subprocess,re
from threading import Thread
# 导入线程
from pubsub import pub
from win32con import AW_ACTIVATE, AW_BLEND, AW_CENTER, AW_HIDE, AW_HOR_NEGATIVE, \
    AW_HOR_POSITIVE, AW_SLIDE, AW_VER_NEGATIVE, AW_VER_POSITIVE, SPI_GETWORKAREA
import win32api
from ctypes import windll, c_int
import time

###########################################################################
## Class MyFrame2
###########################################################################
# 多线程函数
def th_do():
        conf = configparser.ConfigParser()
        # 调用configparser属性方法
        conf.read('dbconf.ini')
        # 读取本地文件
        sects = conf.sections()
        cal = 0
        for i in sects:
            # 遍历 sects中的section
            items = conf.items(sects[cal])
            # 获取(key,value)元组
            host_ini = (items[0][1])
            # 获取第一组key中的value(ip信息)
            p = subprocess.Popen(["ping.exe", '%s'%host_ini],stdin = subprocess.PIPE,
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE,
                shell = True)  
            p.wait() 
            # 等待完成才继续,数量大会造成较长队列,进而会阻塞管道
            returncode = p.returncode
            # 判断shell执行结果,0成功,1失败
            if returncode == 0:
                try:
                        out = p.stdout.read().decode('gbk')
                        # .decode('gbk')原理不熟悉,不加会报错
                        packetdelay = re.compile("= (\d+)ms").findall(out)[1] + 'ms'
                        #获取最长的延迟值(re.compile获取到的值类型是元组)
                        
                except IndexError:
                        wx.CallAfter(pub.sendMessage,'update',msg =(cal,1))
                        cal+=1
                        print ('无法访问目标/网络...',returncode) #调试用
                else:
                        packetlost = re.compile("(\d+)%").findall(out)[0] + '%'
                        #获取包丢失比例(re.compile获取到的值类型是元组)
                        wx.CallAfter(pub.sendMessage,'update',msg = (cal,0,packetdelay,packetlost))
                        cal+=1
            else:
                print (returncode) #调试用
                wx.CallAfter(pub.sendMessage,'update',msg =(cal,1))
                cal+=1
                
# returncode 为 1的情况:
'''
① 请求超时。
② PING:传输失败。常见故障。
③ Ping 请求找不到主机 255.255.255.255。请检查该名称,然后重试。


'''

# returncode 为0 的情况:
'''
① 主机或网络一切正常
② 主机或网络不正常,但能接收到回包,因此此类会抛出异常,所以做了try 
'''


class MyFrame2 ( wx.Frame ):
    # 主窗口
    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = "FreePing", pos = wx.DefaultPosition, size = wx.Size( 600,700 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
        
        self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
        self.SetIcon(wx.Icon('loadIcon.ico', wx.BITMAP_TYPE_ICO))
        #添加icon
        self.m_menubar1 = wx.MenuBar( 0 )
        self.m_menu1 = wx.Menu()
        self.m_menuItem1 = wx.MenuItem( self.m_menu1, wx.ID_ANY, u"Add", wx.EmptyString, wx.ITEM_NORMAL )
        self.m_menu1.Append( self.m_menuItem1 )
        
        self.m_menuItem2 = wx.MenuItem( self.m_menu1, wx.ID_ANY, u"Edit", wx.EmptyString, wx.ITEM_NORMAL )
        self.m_menu1.Append( self.m_menuItem2 )
        self.m_menuItem2.Enable(False)
        
        self.m_menuItem3 = wx.MenuItem( self.m_menu1, wx.ID_ANY, u"Delete", wx.EmptyString, wx.ITEM_NORMAL )
        self.m_menu1.Append( self.m_menuItem3 )
        self.m_menuItem3.Enable(False)
        self.m_menu1.AppendSeparator()
        
        self.m_menuItem4 = wx.MenuItem( self.m_menu1, wx.ID_ANY, u"Reset results", wx.EmptyString, wx.ITEM_NORMAL )
        self.m_menu1.Append( self.m_menuItem4 )
        self.m_menuItem4.Enable(False)
        self.m_menu1.AppendSeparator()
        
        self.m_menuItem5 = wx.MenuItem( self.m_menu1, wx.ID_ANY, u"Exit", wx.EmptyString, wx.ITEM_NORMAL)
        self.m_menu1.Append( self.m_menuItem5 )
        
        self.m_menubar1.Append( self.m_menu1, u"Host" ) 
        
        self.m_menu3 = wx.Menu()
        self.m_menuItem6 = wx.MenuItem( self.m_menu3, wx.ID_ANY, u"Toolbar", wx.EmptyString, wx.ITEM_CHECK )
        self.m_menu3.Append( self.m_menuItem6 )
        self.m_menuItem6.Check( True )
        self.m_menuItem6.Enable(False)

        self.m_menuItem7 = wx.MenuItem( self.m_menu3, wx.ID_ANY, u"Status Bar", wx.EmptyString, wx.ITEM_CHECK )
        self.m_menu3.Append( self.m_menuItem7 )
        self.m_menuItem7.Check( True )
        self.m_menuItem7.Enable(False)
        
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值