一款IP合并和分解工具(二)

        本文是对上一篇文章的补充,看过《一款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()

 运行结果

三:功能实现

1,界面布局实现

创建三个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)

2,IP合并分解实现

这一步我们要实现的是通过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方法来将命令行的输出展示到界面上

3,功能展示

四:总结

        上述的功能实现没有给出全部的源码,有不懂的同学可以私信,其实关键部分文章里都已经讲到了,具体到各个组件的实现大家可以自行去学习,很多技能都是通过摸索才能真正的掌握。本文就介绍到次,谢谢大家的浏览。

猜你喜欢

转载自blog.csdn.net/qq_27071221/article/details/131502763
今日推荐