本文是对上一篇文章的补充,看过《一款IP合并和分解工具(一)》的知道,cidr-merger工具在windows上使用需要用命令行,不是很方便,在这通过python的tkinter进行二次开发,写一个可视化的界面
目录
一:界面概览
二:可视化布局
三:功能实现
1,界面布局实现
2,IP合并分解实现
3,功能展示
四:总结
可视化工具里用到的组件有:PanedWindow,Frame,Label,Radiobutton,Scrollbar,Button
本次界面的布局用到的就是PanedWindow组件,称之为面板组件,这个组件类似于Frame和LabelFrame组件,是容器组件,是可以在此组件内收纳其它组件为自己的子组件,但是跟Frame和LabelFrame组件它可以用鼠标调整面板的大小,可以调节面板的边界。PanedWindow组件的作用是把一个窗体分割成几个部分,这几个部分可以自己调整其大小。
PanedWindow组件的创建语法和相关参数,及方法如下:
background 或 bg |
组件的背景颜色 |
borderwidth 或bd |
组件边框宽度 |
cursor |
组件上的鼠标光标样式 |
handlesize |
分割线上的手柄尺寸,默认是8像素 |
height |
组件高度 |
opaqueresize |
默认为True,组件尺寸随鼠标拖曳而改变,为False,则组件尺寸在鼠标释放时才会更新。 |
orient |
分割方式,HORIZONTAL横向,VERTICAL纵向 |
relief |
组件边框样式 |
sashpad |
设置分割线到窗格间的间距 |
sashrelief |
分割线的样式 |
sashwidth |
分割线的宽度 |
showhandle |
设置是否显示手柄,默认为False不显示 |
width |
组件的宽度 |
方法:
add(组件,参数)
本次工具布局设计是:
1,四层横向切割,第一层是功能选择,第二层是提示输入输出,第三层是结果展示,第四层是功能按钮
2,第二层和第三层又分别做了纵向切割,来区分输入输出
在这里先举一个例子,大家看起来更直观
from tkinter import *
root=Tk() # 源码来自 wb86.com
pw1=PanedWindow(root,orient=VERTICAL,bg='red') # 创建纵向分割面板,背景红色
pw1.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
la1=Label(pw1,text='111111',bg='lightblue') # 标签父组件为pw1
la2=Label(pw1,text='222222',bg='lightgreen') # 标签父组件为pw1
pw1.add(la1) # 加入标签1
pw1.add(la2) # 加入标签2
pw2=PanedWindow(pw1,orient=HORIZONTAL,bg='blue',bd=4)
# 创建横向分割面板,背景蓝色,父组件为pw1,边框宽度为4
la3=Label(pw2,text='333333',bg='yellow') # 标签父组件为pw2
la4=Label(pw2,text='444444',bg='orange') # 标签父组件为pw2
pw1.add(pw2) # pw2加入到pw1
pw2.add(la3) # pw2加入标签3
pw2.add(la4) # pw2加入标签4
root.mainloop()
运行结果
创建三个PanedWindow实例,一个横向,两个纵向
self.funcSelectLayout = PanedWindow(root,orient=VERTICAL,sashrelief='groove') # 创建纵向分割面板, showhandle=True
self.funcSelectLayout.pack(fill=BOTH,expand=True) # 尺寸跟随窗体一起变化
self.inputOutputTextLayout = PanedWindow(self.funcSelectLayout,orient=HORIZONTAL,sashrelief='groove')
self.inputOutputTextLayout.pack(fill=BOTH,expand=True)
self.inputOutputLayout = PanedWindow(self.funcSelectLayout,orient=HORIZONTAL,sashrelief='groove') # 创建横向分割面板,父组件为funcSelectLayout
self.inputOutputLayout.pack(fill=BOTH,expand=True)
创建Radiobutton按钮,Label标签,Text带滚动条的实现部分在此就不一一展现了,这些在我的博客Python专栏里都有写到
将上述创建好的组件加到PanedWindow面板中去
self.funcSelectLayout.add(self.funcSelectFrame,minsize=50)
self.funcSelectLayout.add(self.inputOutputTextLayout,minsize=20)
self.funcSelectLayout.add(self.inputOutputLayout,minsize=480)
self.inputOutputTextLayout.add(self.inputLabel)
self.inputOutputTextLayout.add(self.outpuLabel)
self.inputOutputLayout.add(inputFrame)
self.inputOutputLayout.add(outputFrame)
self.funcSelectLayout.add(startButton,minsize=50)
这一步我们要实现的是通过python去调用命令行并且得到命令行的输出,将得到的输出展现到界面上,这需要用到os模块的popen模块
os.popen带返回值的,如何获取返回值
returnInfo = os.popen(cmd)
然后再通过read() 方法得到字符串结果
def ipMerge(self):
input = self.inputText.get("1.0",END)#其中第一个参数‘1.0’是指从第一行第1列进行读取
with open('input.txt','w') as f:
f.write(input)
returnTxt = os.popen('type input.txt | cidr-merger-windows-amd64.exe -r').read()
self.outpuText.delete("1.0",END)
self.outpuText.insert(INSERT,returnTxt)
def ipSeparate(self):
input = self.inputText.get("1.0",END)#其中第一个参数‘1.0’是指从第一行第1列进行读取
with open('input.txt','w') as f:
f.write(input)
returnTxt = os.popen('type input.txt | cidr-merger-windows-amd64.exe -s').read()
self.outpuText.delete("1.0",END)
self.outpuText.insert(INSERT,returnTxt)
最后调用Text组件的insert方法来将命令行的输出展示到界面上
上述的功能实现没有给出全部的源码,有不懂的同学可以私信,其实关键部分文章里都已经讲到了,具体到各个组件的实现大家可以自行去学习,很多技能都是通过摸索才能真正的掌握。本文就介绍到次,谢谢大家的浏览。