python scale 窗口部件 使用_端口扫描器之python模块tkinter

十步杀一人,千里不留行;事了拂身去,深藏功与名。

《侠客行》 -- 李白
tkinter 简介

python 有许多常用的 GUI 模块,如:PyQt,wxPython,Pywin32,PyGTK,还有今天介绍的 tkinter。

问:为什么有那么多优秀的 GUI 模块,你偏偏选择 tkinter?

答(含情脉脉):几许一人以偏爱,愿尽余生之慷慨。

e0f1eb235068d4993e3f7075b7595702.png

问(反手就是一拳):说人话!

60f7c282a12d9079550f6c21dfb03923.png

答(咳咳):嗯~ Tkinter 是使用 python 进行窗口视窗设计的模块. 简单的构造, 多平台, 多系统的兼容性, 能让它成为让新手快速入门定制窗口文件的好助手. 它在 python 窗口视窗模块中是一款简单型的. 所以用来入门, 熟悉 窗口视窗的使用, 非常有必要。

27474e5273275fdc0ed023c80a4b53e1.png

问(不知从哪拿的一把西瓜刀架在我的脖子上):再给你最后一次机会说实话!

答(毕恭毕敬):我。。。我就会这个,别的,别的啥也不会。。。

c8629a0cfcfaf16ee2222d3e877aac12.png

常用的组件

这里就介绍 tkinter 会用到的几个组件,分别是:标签和按钮,选择按钮,输入和文本框,弹窗,尺度和放置位置。

1

新建一个空白的界面 

每一个 tkinter 应用的主体框架都可以包含下面这部分. 定义 window 窗口 和 window 的一些属性, 然后书写窗口内容(往窗口添加部件), 最后执行 window.mainloop 让窗口活起来.

import tkinter as tkwindow = tk.Tk() # 初始化一个窗口实例window.title('Empty Window') # 窗口标题window.geometry("300x300") # 窗口大小# 这里可以自定义控件,为窗口添加内容window.mainloop() # 进入消息循环,和 Cmd 类的 cmdloop() 类似

0b5ff7053f025d6d6addd031c2d4893b.png

2

Label&Button 标签和按钮 

① 先新建一个用来描述的标签,使用 Label 控件。

I = tk.Label(window,             text='This is a label', # 标签的文字             bg='yellow', # 背景颜色             font=('Arial',12), # 字体和字体大小             width=15,height=2 # 标签长宽             )I.pack() # 每一个空间定义完都要 pack 才能成效

045f157e4d530fe0c7ac5cd10c5de718.png

② 接着定义一个按钮,使用 Button 控件,值得注意的是,Button 控件点击之后会触发一个函数 Scan ,这个可以是我们自定义的扫描函数,当我们点击 "扫描" 按钮之后就会自动扫描某 IP 的端口了。

def Scan():    pass# 定义按钮b = tk.Button(window,              text = '扫描',              width = 7,height=1,              command = Scan              )b.pack()

c4cec14c4361809cf5ce585e21e31a22.png

3

Radiobutton 选择按钮

定义可选按钮使用 radiobutton 控件,为便于演示,我们使用 Label 控件来配合。

定义一个 var 用来将 radiobutton 的值和 Label 的值联系在一起,其中variable=var, value='A' 的意思就是,当我们鼠标选中了其中一个选项,把 value 的值 A 放到变量 var 中,然后赋值给 variable。

import tkinter as tkwindow = tk.Tk()  # 初始化一个窗口实例window.title('Empty Window')  # 窗口标题window.geometry("300x300")  # 窗口大小# 定义标签I = tk.Label(window, bg='yellow', width=25, text='empty')I.pack()# 定义一个按钮触发函数def print_selection():    I.config(text='you have selected ' + var.get())var = tk.StringVar() # 定义一个 var 用来将 radiobutton 的值和 Label 的值联系在一起# 定义按钮r1 = tk.Radiobutton(window, text='TCP',                   variable=var, value='TCP',                   command=print_selection)r2 = tk.Radiobutton(window,text='UDP',                    variable=var,value='UDP',                    command=print_selection)r1.pack()r2.pack()window.mainloop()  # 进入消息循环,和 Cmd 类的 cmdloop() 类似

6e585a03e3caeef79f37a5c9f99d8498.png

4

Entry&Text 输入和文本框 

① 文本输入框使用控件 Entry

# 定义输入框e = tk.Entry(window, show='')e.pack()

② 文本输出框使用控件 Text

# 定义输出框t = tk.Text(window, height=5)t.pack()

③ 定义一个按钮,将在输入框的内容输出到输出框中,整体代码如下:

import tkinter as tkwindow = tk.Tk()  # 初始化一个窗口实例window.title('Empty Window')  # 窗口标题window.geometry("300x300")  # 窗口大小# 定义输入框e = tk.Entry(window, show='')e.pack()# 定义输出框t = tk.Text(window, height=5)t.pack()# 执行函数def insert():    var = e.get()    t.insert('end', var)  # end 属性表示将 var 值添加在文本框的最后,insert 属性表示将 var 值添加在 鼠标指定的位置# 定义按钮b = tk.Button(window, text='输出', command=insert)b.pack()window.mainloop()  # 进入消息循环,和 Cmd 类的 cmdloop() 类似

7e8d5a4f1ec6933dee12afc91e758da0.png

5

Messagebox 弹窗 

messagebox 就是平时所看到的弹窗,要先导入 messagebox 类,然后这里定义一个按钮来触发弹窗。

import tkinter as tkimport tkinter.messageboxwindow = tk.Tk()  # 初始化一个窗口实例window.title('Empty Window')  # 窗口标题window.geometry("300x300")  # 窗口大小# 触发函数def click():    tk.messagebox.showinfo(title='弹窗',message='这是一个弹窗')# 定义一个按钮触发弹窗b = tk.Button(window,text='click me',command=click)b.pack()window.mainloop()  # 进入消息循环,和 Cmd 类的 cmdloop() 类似

5167189d8b627b919f6c1ae464af043e.png

还有其他的几种弹框形式,可以将它们的结果打印出来看看

print(tk.messagebox.showwarning(title='Hi', message='nononono'))print(tk.messagebox.showerror(title='Hi', message='you are wrong'))print(tk.messagebox.askquestion(title='Hi', message='go ahead?'))print(tk.messagebox.askretrycancel(title='Hi',message='retry cancel?'))print(tk.messagebox.askokcancel(title='Hi',message='concel?'))print(tk.messagebox.askyesnocancel(title='Hi',message='cancel or no?'))print(tk.messagebox.askyesno(title='Hi',message='yes or no?')

6

Scale 尺度 

尺度条使用的控件是 Scale。

s = tk.Scale(window, label='Thread', from_=0, to=20, orient=tk.HORIZONTAL,             length=400, showvalue=1, tickinterval=4, resolution=0.01, command=print_selection)s.pack()

Scale 控件中,参数的解释如下:

  • 参数 label 表示控件的名称。

  • 参数 from_=5,to=11 的意思就是从 5 到 11,即这个滚动条最小值为 5,最大值为 11(这里使用 from_ 是因为在 python 中有 from 这个关键词)。

  • 参数 orient=tk.HORIZONTAL 在这里就是设置滚动条的方向,如我们所看到的效果图,这里 HORIZONTAL 就是横向。

  • 参数 length 这里是指滚动条部件的长度,但注意的是和其他部件 width 表示不同,width 表示的是以字符为单位,比如 width=4,就是 4 个字符的长度,而此处的 length=200,是指我们常用的像素为单位,即长度为 200 个像素。

  • showvalue=0 表示不显示游标上面的值,0 表示上方无结果显示,1 则会显示游标定位的值。

  • 参数 tickinterval 设置的就是坐标的间隔。

  • 参数 resolution=0.01 表示游标上的数值保留到小数点后两位。

这里定义一个标签用于显示游标指定的值。PS:在触发函数 print_selection(v) 中出现了一个形参 v,这里的形参 v 代表了游标定位的值,和字母无关,将 v 换成 value 也行。

整体代码如下:

import tkinter as tkwindow = tk.Tk()  # 初始化一个窗口实例window.title('Empty Window')  # 窗口标题window.geometry("400x300")  # 窗口大小I = tk.Label(window, bg='yellow', width=20, text='empty')I.pack()def print_selection(v):    I.config(text='Thread = ' + v)s = tk.Scale(window, label='Thread', from_=0, to=20, orient=tk.HORIZONTAL,             length=400, showvalue=1, tickinterval=4, resolution=0.01, command=print_selection)s.pack()window.mainloop()  # 进入消息循环,和 Cmd 类的 cmdloop() 类似

0e9b6ac8c7a637fd2da913e5a9e315b6.png

7

Pack Grid Place放置位置 

"放置位置" 通俗地理解就是将控件置与某处嘛,这在 tkinter 中有一个官方的说法,就是 "几何管理"。

tkinter 控件有特定的几何状态管理方法,管理整个控件区域组织,以下是 tkinter 公开的几何管理类:包、网络、位置。

几何方法描述
pack()包装
grid()网络
place()位置

这里只介绍 place,前面两种有兴趣的童鞋自行参悟。place 比较容易理解,就是给精确的坐标 (x , y) 来定位,anchor=nw 就是将锚点定在西北角。(要有坐标的话,肯定得确定坐标系吧,要确定坐标系,得确定原点吧)

tk.Label(window,text=1).place(x=20,y=30,anchor='nw')

ca2e73630708ae541e04b3dbf3279c52.png

8

总结 

到这里,我们已经完全可以使用上面所学,将我们脑中所构思的 "端口扫描器" 的界面大致画出来了,下面是我的想法(正所谓一千个观众有一千个哈姆雷特)

# -*- coding: utf-8 -*-"""@Run by : Python3@Author: ai_li@Date: 2020/6/28 19:42@File: tmp.py"""import tkinter as tk# 初始化一个窗口实例window = tk.Tk()  # 初始化一个窗口实例window.title('Port Scanner v1')  # 窗口标题window.geometry("500x350")  # 窗口大小tk.Label(window,text='配置如下:').place(x=10,y=20,anchor='nw')tk.Label(window,text='起始IP:').place(x=10,y=50,anchor='nw')tk.Entry(window,show='').place(x=60,y=50,anchor='nw')tk.Label(window,text='结束IP:').place(x=10,y=90,anchor='nw')tk.Entry(window,show='').place(x=60,y=90,anchor='nw')tk.Label(window,text='端口:').place(x=10,y=130,anchor='nw')tk.Entry(window,show='').place(x=60,y=130,anchor='nw')tk.Label(window,text='延时:').place(x=10,y=170,anchor='nw')tk.Entry(window,show='',width=5).place(x=60,y=170,anchor='nw')tk.Label(window,text='毫秒').place(x=110,y=170,anchor='nw')# tk.Label(window,text='线程:').place(x=10,y=210,anchor='nw')# tk.Entry(window,show='',width=5).place(x=60,y=210,anchor='nw')s = tk.Scale(window,label='线程',from_=0,to=20,orient=tk.HORIZONTAL,             length=200, showvalue=1, tickinterval=10, resolution=1)s.place(x=10,y=210,anchor='nw')var = tk.StringVar()tk.Radiobutton(window,text='TCP',variable=var,value='TCP').place(x=110,y=210,anchor='nw')tk.Radiobutton(window,text='UDP',variable=var,value='UDP').place(x=160,y=210,anchor='nw')tk.Button(window,text='扫描',width=9).place(x=30,y=310,anchor='nw')tk.Button(window,text='退出',width=9).place(x=140,y=310,anchor='nw')tk.Label(window,text='扫描结果:').place(x=250,y=20,anchor='nw')tk.Text(window,height=20,width=30).place(x=255,y=50,anchor='nw')window.mainloop()  # 进入消息循环,和 Cmd 类的 cmdloop() 类似

c9052768c3c56983b0957c3c66b473e5.png

尾声

好了,这篇文章就写到这里,tkinter 还有许多很有意思的组件,所谓,工欲善其事必先利其器,"器" 已经有了,怎么利用就在于各位的天马行空 ,有待大家去探索了,这里就不一一列举了。主要是我不会。。。咋滴,爱怎怎,哈哈哈

d71241ebf61459c42089bf56b621047e.png

我是匠心,一个在清流旁默默磨剑的匠人,希望有一天能利刃出鞘,仗剑走江湖。

5b926fb47958e2eca340354f4aa37d09.png

喜欢就主动点,在看
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值