radiobutton控件(讲解python常用框架)

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

《侠客行》 — 李白

tkinter 简介

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

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

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

radiobutton控件(讲解python常用框架)

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

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

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

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

常用的组件

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

1

新建一个空白的界面

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

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

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 才能成效

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

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(“300×300”) # 窗口大小# 定义标签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() 类似

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(“300×300″) # 窗口大小# 定义输入框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() 类似

5

Messagebox 弹窗

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

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

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

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 也行。

整体代码如下:

importtkinterastkwindow = tk.Tk() # 初始化一个窗口实例window.title(‘Empty Window’) # 窗口标题window.geometry(“400×300”) # 窗口大小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() 类似

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’)

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(“500×350″) # 窗口大小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() 类似

尾声

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

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

发表评论

登录后才能评论