Python Tkinter窗口化Ping小工具 (Windows/Liux)

Python 3.5的一个窗口化小工具,定时ping列表中的服务器。

程序启动配置的两种方式

  1. 预定义:下方代码去掉iplist.update的注释即可。

格式为iplist.update({“主机”:“注释”})

iplist = dict()
#iplist.update({"14.215.177.39":"百度ip"})
#iplist.update({"www.baidu.com":"百度"})
  1. 启动后输入:进入程序后输入地址*(没有地址注释功能)*,只需将所有iplist.update注释掉即可。

程序界面

  • 预定义带注释的界面

Windows界面 Linux界面 (树莓派)
Windows下程序窗口 Linux下程序窗口

每行的格式为:地址注释 地址 [延迟(ms)]

#地址列表
iplist = dict()
iplist.update({"14.215.177.39":"百度ip"})
iplist.update({"www.baidu.com":"百度"})
  • 非预定义的地址输入界面

每输入一行地址回车输入下一行,输入0结束输入
手动输入 不带注释的窗口

背景颜色

状态 背景色 [文字信息]
正常 #7FFFAA 延迟值
缓慢 #FFD700 延迟值
一次Ping失败 #FFD39B X
两次Ping失败 #FF8C69 XX
三次及以上Ping失败 #FF2222 XXX

示例:两次ping失败
两次失败

依赖库 tkinter 安装

windows下Python3.2版本之后是自动安装tkinter。如需安装参考下方的连接

https://blog.csdn.net/qq_32005671/article/details/72903018 by:数据阿伯

最后贴上代码

import os
import sys
import platform
import tkinter as tk
"""
	窗口Ping工具
	by MaxMiku Feb 9th 2019
	适配Windows与linux

	可以选择预定义或者进入程序后再输入目标主机
	预定义只需将下方解除定义注释即可
	iplist.update({"主机":"注释"})
"""

#地址列表
iplist = dict()
iplist.update({"14.215.177.39":"百度ip"})
iplist.update({"www.baidu.com":"百度"})

#窗口宽度 若地址显示不全可以自定义
win_weight=200



#========代码部分==========
#获取系统版本 区分指令
osver=sys.platform
print("Now system is %s"%osver)
if(osver.find("win",0,len(osver))!=-1):
	#win
	Iswin=True
	ping_comm='ping -n 1 -w 1 %s'
	line_head="来自 "
	delay_head=" 时间"
	delay_foot="ms "
else:
	#linux
	Iswin=False
	ping_comm='ping -c 1 -w 1 %s'
	line_head="64 bytes from"
	delay_head=" time="
	delay_foot=" ms"

#截取字符串
def getCenterText(source,head,end,includeHeadAndEnd=False,skip=0):
	"""
		includeHeadAndEnd 是否包含头尾 0假 1真
		skip 跳过次数 int
	"""
	pot_s=0#起始位置
	pot_e=0#终止位置
	len_soc=len(source)#长度
	result=""#结果
	count=skip#跳过计数
	
	pot_s=source.find(head,0,len_soc)+len(head)
	while(pot_s!=-1 & count>0):
		pot_s=source.find(head,pot_s+1,len_soc)+len(head)
		count=count-1
	if(pot_s!=-1):
		pot_e=source.find(end,pot_s+1,len_soc)
		if(pot_e!=-1):
			result=source[pot_s:pot_e]
		else:
			return ""
	else:
		return ""
	
	if(includeHeadAndEnd):
		return head+result+end
	else:
		return result

timeout_count=dict()
getin="0"
if(len(iplist)==0):
	getin=input("Please input the ip [1]:")
while(getin!="0"):
	iplist.update({"%s"%getin:""})
	getin=input("Please input the ip(0 to continue)["+str(len(iplist)+1)+"]:")
	
win_heigh=0
num_ip=0
print("List: "+str(len(iplist)))
for ip in iplist:
	num_ip=num_ip+1
	print(str(num_ip)+" ==> "+str(ip))
	timeout_count.update({ip:0})

if(Iswin):
	win_heigh=num_ip*42
else:
	win_heigh=num_ip*34


def ping_host(ip):
	
	"""
		返回延迟 失败返回-1
	"""
	backinfo=os.popen(ping_comm%ip).read()
	# print(backinfo)
	#~ print(getCenterText(backinfo,"64 bytes from","\n",True))
	delay=getCenterText(getCenterText(backinfo,line_head,"\n",True),delay_head,delay_foot)
	if(Iswin):
		delay=delay[1::]
	if (delay!=""):
		#~ print("delay is %s"%delay)
		return float(delay)
	else:
		#~ print("Ping failed.")
		return -1.0

window = tk.Tk()#创建窗口
window.wm_attributes('-topmost',1)#置顶
window.title('Ping!')
window.geometry('%sx%s'%(win_weight,win_heigh))#动态设置高度
txtLab=dict()#存放标签文本


for ip in iplist:
	
	var = tk.StringVar()    # 文字变量储存器
	
	label=tk.Label(window,
		textvariable=var,
		#~ bg='green',     # 背景颜色
		font=('Arial', 12),     # 字体和字体大小
		width=33, height=2 ) # 标签长宽)
	label.pack()    # 固定窗口位置
	temp={"%s"%ip:var,"%sojb"%ip:label}
	txtLab.update(temp)


for ip in iplist:
	a=txtLab.get(ip)
	a.set(ip)

def pingit():
	global timeout_count
	for ip in iplist:#尝试调用
		ret=ping_host(ip)
		
		if(ret==-1):
			tmp=timeout_count.get(ip)
			tmp=tmp+1
			timeout_count.update({ip:tmp})
			
			if(tmp>3):
				tmp=3
			
			a=txtLab.get(ip)
			a.set(iplist.get(ip)+" "+ip+" ["+"X"*tmp+"]")
			
			if(tmp==1):
				a=txtLab.get("%sojb"%ip)
				a.config(bg='#FFD39B')
			else:
				if(tmp==2):
					a=txtLab.get("%sojb"%ip)
					a.config(bg='#FF8C69')
				else:
					if(tmp==3):
						a=txtLab.get("%sojb"%ip)
						a.config(bg='#FF2222')
				#~ print(ip+" Failed to ping.")
		else:
			tmp=timeout_count.get(ip)
			if(tmp!=0):
				timeout_count.update({ip:0})
			
			a=txtLab.get(ip)
			if(Iswin):
				a.set(iplist.get(ip)+" "+ip+" [%.0f]"%ret)
			else:
				a.set(iplist.get(ip)+" "+ip+" [%.1f]"%ret)
			if(ret>250):
				a=txtLab.get("%sojb"%ip)
				a.config(bg='#FFD700')
			else:
				a=txtLab.get("%sojb"%ip)
				a.config(bg='#7FFFAA')
			#~ print(ip+" %.1f"%ret)
	#~ currentTime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
	#~ Label1.config(text=currentTime)
	window.update()
	window.after(1000, pingit)
window.after(1000, pingit)


window.mainloop()

发布了5 篇原创文章 · 获赞 1 · 访问量 358

猜你喜欢

转载自blog.csdn.net/gps444/article/details/87037508