因之前用的ping网络服务的工具,有些功能在win7下不太好用。去年刚好自学了python,想练下手,因此就用了wxpython开发了ping小程序。如下:
小程序主界面:
不好的地方:
- 如果弹窗提醒忘了关闭,就直接关掉主程序会报错。暂时还没能力做到关闭主程序的同时销毁报弹窗提醒窗口。
- 不会代码重构,所以重复代码较多。
源码:
# -*- 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)