文章开头作为今天2021第一天,还是先祝各位猿友元旦快乐,新的一年大家头发越来越多,bug越来越少。
回到正题,上一篇文章已经给大家简单介绍了pcapbuilder工具所用到的库和要实现的功能。今天就先具体讲讲工具首页的实现。首先看看首页的布局,如下图
首页很简单就两个组件,一个标签和一个按钮。点击按钮要实现的功能是切换到第二界面。实现界面用的是python的tkinter 模块。Python自带了tkinter 模块,是一种面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。其图像化编程的基本步骤通常包括:
- 导入tkinter模块
- 创建GUI根窗体
- 添加人机交互控件并编写相应的函数
- 在主事件循环中等待用户触发事件响应
运行程序跳出来的窗体就是上述步骤二的根窗体,根窗体是图像化应用程序的根控制器,是tkinter的底层控件的实例。当导入tkinter模块后,调用 Tk()方法可初始化一个根窗体实例 root ,用 title() 方法可设置其标题文字,用geometry()方法可以设置窗体的大小(以像素为单位)。将其置于主循环中,除非用户关闭,否则程序始终处于运行状态。
接下来详细讲一下首页布局中用到的两个控件----标签和按钮
标签的作用是显示单行文本。其属性包括尺寸、颜色、字体、相对位置、浮雕样式、图标样式和悬停光标形状等。贴出该部分的代码片段
root= Tk()
class maindesk():
def __init__(self,):
root.title('pcapbuilder')
root.geometry('700x500')
def placeLbAndButton(self):
self.lb = Label(root, text='Wlcome To PcapBuilder', \
bg='#d3fbfb', \
fg='red', \
font=('华文新魏', 32), \
width=30, \
height=2, \
relief=FLAT)
self.lb.place(relx=0.02, rely=0.35)
标签实例lb 在父容器root中实例化,具有代码中所示的text(文本)、bg(背景色)、fg(前景色)、font(字体)、width(宽,默认以字符为单位)、height(高,默认以字符为单位)和 relief(浮雕样式)等一系列属性。在实例化控件时,实例的属性可以“属性=属性值”的形式枚举列出,不区分先后次序。例如:“ text='Welcome to PcapBuilder' ”显示标签的文本内容,“bg='#d3fbfb'”设置背景色为十六进制数RGB色 #d3fbfb等等。属性值通常用文本形式表示。单独讲一下relief属性,该属性决定标签控件显示出来的样式,其总共有五种样式,FLAT(平的)、RAISED(凸起的)、SUNKEN(凹陷的)、GROOVE(沟槽状边缘)和 RIDGE(脊状边缘)。具体大家可以每种样式都试一下看下效果,选择自己喜欢的。其他属性可自行上网查找。
设置好Lable的属性后得给他一个安身之所,放到窗体的具体位置上。这就涉及到控件的布局。控件的布局通常pack()、grid()和place()三种,这里用到的是place()方法。
place()方法:根据控件实例在父容器中的绝对或相对位置参数进行布局。其常用布局参数如下:
- x,y:控件实例在根窗体中水平和垂直方向上的其实位置(单位为像素)。注意,根窗体左上角为0,0,水平向右,垂直向下为正方向。
- relx,rely:控件实例在根窗体中水平和垂直方向上起始布局的相对位置。即相对于根窗体宽和高的比例位置,取值0.0~1.0之间。
- height,width:控件实例本身的高度和宽度(单位为像素)。
- relheight,relwidth:控件实例相对于根窗体的高度和宽度比例,取值0.0~1.0之间。
- 利用place()方法配合relx,rely和relheight,relwidth参数所得的到的界面可自适应根窗体尺寸的大小。
以上就是标签和控件的布局用法
按钮(Button)主要是为响应鼠标单击事件触发运行程序所设的,故其除控件共有属性外,属性command是最为重要的属性。通常,将按钮要触发执行的程序以函数形式预先定义,然后调用函数来实现点击按钮所要达到的效果。
self.btn = Button(root, text='start',font=('华文新魏', 20), command=self.main)
self.btn.place(relx=0.35, rely=0.6, relwidth=0.3, relheight=0.1)
command后面就是按钮所要实现的功能,其有两种调用方式
- 直接调用函数。参数表达式为“command=函数名”,注意函数名后面不要加括号,也不能传递参数。如本例中使用的command=self.main:
- 利用匿名函数调用函数和传递参数。参数的表达式为“command=lambda”:函数名(参数列表)。后面会用到该调用方式。
点击按钮后切换到第二界面,调用的是main函数
def main(self):
self.lb.place_forget()
self.btn.place_forget()
pcapnotebook.main()
实现界面切换的效果实际上是把首页界面上的标签和按钮隐藏,然后布局第二界面上的控件,来达到切换的效果。注意的是place_forget()将组件从屏幕中“删除”, 并没有销毁该组件,只是看不到了。
至此首页的控件及其布局就这么多,另外tkinter提供了其他丰富的控件,大家感兴趣也可以自行去尝试其他的控件及其用法。下面贴出该部分的代码。
from tkinter import *
from tkinter import ttk
from http import httpclass
from https import httpsclass
root= Tk()
class maindesk():
def __init__(self,):
root.title('pcapbuilder')
root.geometry('700x500')
def placeLbAndButton(self):
self.lb = Label(root, text='Wlcome To PcapBuilder', \
bg='#d3fbfb', \
fg='red', \
font=('华文新魏', 32), \
width=30, \
height=2, \
relief=FLAT)
self.lb.place(relx=0.02, rely=0.35)
self.btn = Button(root, text='start',font=('华文新魏', 20), command=self.main)
self.btn.place(relx=0.35, rely=0.6, relwidth=0.3, relheight=0.1)
def main(self):
self.lb.place_forget()
self.btn.place_forget()
pcapnotebook.main()
class pcapnotebook():
@classmethod
def main(cls):
pass #欲知故事如何请听下回分解
if __name__ == '__main__':
maindesk().placeLbAndButton()
root.mainloop()