Tkinter保姆级教程(下)(一)

简介: Tkinter保姆级教程(下)(一)

目录


Scale控件


Canvas画布控件


Menu菜单控件


Scrollbar滚动条控件


Event事件处理


布局管理器(pack,grid,place)


pack()


grid()


place()


布局管理控件


Frame控件


LabelFrame控件


PanedWindow控件


对话框控件


文件选择对话框


颜色选择对话框


消息对话框

Scale控件

Scale 控件,即滑块控件或标尺控件,该控件可以创建一个类似于标尺式的滑动条对象,用户通过操作它可以直接设置相应的数值(刻度值)。Scale 控件同样有许多应用场景,并且在我们日常工作中也会经常用到,比如电脑上调节音量的滑动条(数值范围 0-100),如下图所示:

image.png

Scale 控件常用的基本属性如下所示:

参数 说明
activebackground 指定当鼠标在上方飘过的时候滑块的背景颜色
bigincrement 1. 设置“大”增长量
2. 该选项设置增长量的大小
3. 默认值是 0,增长量为范围的 1/10
borderwidth 1. 指定边框宽度
2. 默认值是 2
command 1. 指定一个函数,每当滑块发生改变的时候都会自动调用该函数
2. 该函数有一个唯一的参数,就是最新的滑块位置
3. 如果滑块快速地移动,函数可能无法获得每一个位置,但一定会获得滑块停下时的最终位置
digits 1. 设置最多显示多少位数字
2. 补充注释:例如设置 from 选项为 0,to 选项为 20,digits 选项设置为 5,那么滑块的范围就是在 0.000 ~ 20.000 直接滑动
3. 默认值是 0(不开启)
font 1. 指定滑块左侧的 Label 和刻度的文字字体
2. 默认值由系统指定
from_ 1. 设置滑块最顶(左)端的位置
2. 默认值是 0
highlightcolor 1. 指定当 Scale 获得焦点的时候高亮边框的颜色
2. 默认值由系统指定
label 1. 你可以在垂直的 Scale 组件的顶端右侧(水平的话是左端上方)显示一个文本标签
2. 默认值是不显示标签
length 1. Scale 组件的长度,默认值是 100 像素
orient 1. 设置 Scale 控件是水平放置(HORIZONTAL)还是垂直放置(VERTICAL)
2. 默认值是 VERTICAL(垂直放置)
repeatdelay 1. 该选项指定鼠标左键点击滚动条凹槽的响应时间
2. 默认值是 300(毫秒)
repeatinterval 1. 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔
2. 默认值是 100(毫秒)
resolution 1. 指定 Scale 组件的分辨率(每点击一下移动的步长)
示例: 比如 resolution 选项设置为 0.1 的话,那么每点击一下鼠标就是在 0.0 ~ 20.0 之间以 0.1 的步长移动
2. 该参数的默认值是 1
showvalue 1. 设置是否显示滑块旁边的数字
2. 默认值为 True
sliderlength 1. 设置滑块的长度
2. 默认值是 30 像素
state 1. 默认情况下 Scale 组件支持鼠标事件和键盘事件,可以通过设置该选项为 DISABLED 来禁用此功能
2. 默认值是 NORMAL
takefocus 1. 指定使用 Tab 键是否可以将焦点移动到该 Scale 组件上
2. 默认是开启的,可以通过将该选项设置为 False 避免焦点落在此组件上
tickinterval 1. 设置显示的刻度,如果设置一个值,那么就会按照该值的倍数显示刻度
2. 默认值是不显示刻度
to 1. 设置滑块最底(右)端的位置
2. 默认值是 100
troughcolor 1. 设置凹槽的颜色
2. 默认值由系统指定
variable 1. 指定一个与 Scale 组件相关联的 Tkinter 变量,该变量存放滑块最新的位置
2. 当滑块移动的时候,该变量的值也会发生相应的变化
width 1. 指定 Scale 组件的宽度
2. 默认值是 15 像素

Scale 常用方法有如下四个,见下表所示:

方法 说明
coords(value=None) 1. 获得当前滑块位置相对于 Scale 控件左上角位置的相对坐标,
2. 如果设置了 value 值,则返回当滑块位于该位置时与左上角的相对坐标
get() 获得当前滑块的位置(即当前数值),返回值可以为整型或者浮点型
identify(x, y) 返回一个字符串表示指定位置下的 Scale 控件
set(value) 设置 Scale 控件的值,即滑块的位置,默认为初始位置

下面看一组简单的实例应用:创建一个 Scale 控件

from tkinter import *
# 创建主窗口
win =Tk()
win.title("控制管理界面")
win.iconbitmap('favicon.ico')
win.geometry('400x250')
# 添加一个 Scale 控件,默认垂直方向,步长设置为 5,长度为200,滑动块的大小为 50,最后使用label参数文本
s=Scale(win, from_ =100, to =0,resolution =5,length =200,sliderlength= 20,label ='音量控制' )
s.pack()
# 设置滑块的位置
s.set(value=15)
# 显示窗口
mainloop()

image.png

下面看一个稍微复杂点的应用示例,代码如下:

import tkinter as tk
window = tk.Tk()
window.title("购物车界面")
window.iconbitmap('favicon.ico')
window.geometry('450x200+450+250')
window.resizable(0,0)
# 创建一个文本标签
label = tk.Label(window, bg='#9FB6CD',width=18, text='')
label.grid(row =2)
# 创建执行函数
def select_price(value):
    label.config(text='您购买的数量是 ' + value)
# 创建 Scale控件
scale = tk.Scale(window,
             label='选择您要购买的数量',
             from_=1,
             to= 100,
             orient=tk.HORIZONTAL,   # 设置Scale控件平方向显示
             length=400,
             tickinterval=9,       # 设置刻度滑动条的间隔
             command=select_price)  # 调用执行函数,是数值显示在 Label控件中
scale.grid(row =1)
# 显示窗口
window.mainloop()

image.png

Canvas画布控件

Canvas 控件具有两个功能,首先它可以用来绘制各种图形,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片(包括位图),我们将这些绘制在画布控件上的图形,称之为“画布对象”。每一个画布对象都有一个“唯一身份ID”,这是 Tkinter 自动为其创建的,从而方便控制和操作这些画布对象。通过 Canvas 控件创建一个简单的图形编辑器,让用户可以达到自定义图形的目的,就像使用画笔在画布上绘画一样,可以绘制各式各样的形状,从而有更好的人机交互体验。


Canvas控件基本属性


下面对 Canvas 控件的常用属性做简单的介绍,如下表所示:

属性 方法
background(bg) 指定 Canvas 控件的背景颜色
borderwidth(bd) 指定 Canvas 控件的边框宽度
closeenough 1. 指定一个距离,当鼠标与画布对象的距离小于该值时,认为鼠标位于画布对象上
2. 该选项是一个浮点类型的值
confine 1. 指定 Canvas 控件是否允许滚动超出 scrollregion 选项设置的滚动范围,默认值为 True
selectbackground 指定当画布对象(即在 Canvas 画布上绘制的图形)被选中时的背景色,
selectborderwidth 指定当画布对象被选中时的边框宽度(选中边框)
selectforeground 指定当画布对象被选中时的前景色
state 设置 Canvas 的状态:"normal" 或 "disabled",默认值是 "normal",注意,该值不会影响画布对象的状态
takefocus 指定使用 Tab 键可以将焦点移动到输入框中,默认为开启,将该选项设置为 False 避免焦点在此输入框中
width 指定 Canvas 的宽度,单位为像素
xscrollcommand 与 scrollbar(滚动条)控件相关联(沿着 x 轴水平方向)
xscrollincrement 1. 该选项指定 Canvas 水平滚动的“步长”
2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')
3. 默认为 0,表示可以水平滚动到任意位置
yscrollcommand 与 scrollbar 控件(滚动条)相关联(沿着 y 轴垂直方向)
yscrollincrement 1. 该选项指定 Canvas 垂直滚动的“步长”
2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')
3. 默认值是 0,表示可以垂直方向滚动到任意位置

Canvas控件绘图常用方法

Cansvas 控件提供了一系列绘制几何图形的常用方法,下面对这些方法做简单介绍:

方法 说明
create_line(x0, y0, x1, y1, ... , xn, yn, options) 1. 根据给定的坐标创建一条或者多条线段;
2. 参数 x0,y0,x1,y1,...,xn,yn 定义线条的坐标;
3. 参数 options 表示其他可选参数
create_oval(x0, y0, x1, y1, options) 1. 绘制一个圆形或椭圆形;
2. 参数 x0 与 y0 定义绘图区域的左上角坐标;参数 x1 与 y1 定义绘图区域的右下角坐标;
3. 参数 options 表示其他可选参数
create_polygon(x0, y0, x1, y1, ... , xn, yn, options) 1. 绘制一个至少三个点的多边形;
2. 参数 x0、y0、x1、y1、...、xn、yn 定义多边形的坐标;
3. 参数 options 表示其他可选参数
create_rectangle(x0, y0, x1, y1, options) 1. 绘制一个矩形;
2. 参数 x0 与 y0 定义矩形的左上角坐标;参数 x 与 y1 定义矩形的右下角坐标;
3. 参数 options 表示其他可选参数
create_text(x0, y0, text, options) 1. 绘制一个文字字符串。其中
2. 参数 x0 与 y0 定义文字字符串的左上角坐标,参数 text 定义文字字符串的文字;
3. 参数 options 表示其他可选参数
create_image(x, y, image) 1. 创建一个图片;
2. 参数 x 与 y 定义图片的左上角坐标;
3. 参数 image 定义图片的来源,必须是 tkinter 模块的 BitmapImage 类或 PhotoImage 类的实例变量。
create_bitmap(x, y, bitmap)

1. 创建一个位图;

2. 参数 x 与 y 定义位图的左上角坐标;

3. 参数 bitmap 定义位图的来源,参数值可以是 gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question,或者也可以直接使用 XBM(X Bitmap)类型的文件,此时需要在 XBM 文件名称前添加一个 @ 符号,例如 bitmap=@hello.xbm

create_arc(coord, start, extent, fill) 1. 绘制一个弧形;
2. 参数 coord 定义画弧形区块的左上角与右下角坐标;
3. 参数 start 定义画弧形区块的起始角度(逆时针方向);
4. 参数 extent 定义画弧形区块的结束角度(逆时针方向);
5. 参数 fill 定义填充弧形区块的颜色。

注意:上述方法都会返回一个画布对象的唯一 ID。关于 options 参数,下面会通过一个示例对经常使用的参数做相关介绍。(但由于可选参数较多,并且每个方法中的参数作用大同小异,因此对它们不再逐一列举)


从上述表格不难看出,Canvas 控件采用了坐标系的方式来确定画布中的每一点。一般情况下,默认主窗口的左上角为坐标原点,这种坐标系被称作为“窗口坐标系”,但也会存在另外一种情况,即画布的大小可能大于主窗口,当发生这种情况的时,可以采用带滚动条的 Canvas 控件,此时会以画布的左上角为坐标原点,我们将这种坐标系称为“画布坐标系”。


绘制直线

下面示例展示了如何在画布(Canvas控件)上绘制一条虚线和实线,代码如下:

from tkinter import *
root = Tk()
# 设置窗口的背景颜色以区别画布
root.config(bg='#87CEEB')
root.title("艾派森")
root.geometry('450x350')
root.iconbitmap('favicon.ico')
# 设置画布的背景颜色为白色
cv=Canvas(root,bg="white",width =300, height = 250)
# 将控件放置在主窗口中
cv.pack()
# 设置坐标点,此处可以元组的形式来设置坐标点
point=[(10,20),(20,30),(30,40),(40,100),(80,120),(150,90)]
# 创建画布,添加线条
# fill 参数指定填充的颜色,如果为空字符串,则表示透明
# dash 参数表示用来绘制虚线轮廓,元组参数,分别代表虚线中线段的长度和线段之间的间隔
# arrow 设线段的箭头样式,默认不带箭头,参数值 first 表示添加箭头带线段开始位置,last表示到末尾占位置,both表示两端均添加
# smooth 布尔值参数,表示是否以曲线的样式划线,默认为 False
# width 控制线宽
line1=cv.create_line(point,fill="purple",dash=(1,1),arrow=LAST,width=5)
line2=cv.create_line(point,fill="red",arrow=BOTH,smooth=TRUE,width=5)
# 移动其中一条线段,只需要更改其坐标就可以,使用 coords()方法移动曲线
cv.coords(line2,50,30,25,35,35,40,50,120,60,170,10,180)
# 显示窗口
root.mainloop()

image.png

上述示例中涉及了一部分参数,比如 fill、dash、arrow 等,下表对 create_line() 函数的相关参数做了简单介绍:

属性 说明
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
arrow 1. 默认线段是不带箭头的,通过设置该选项添加箭头到线段中
2. "first" 表示添加箭头到线段开始的位置
3. "last" 表示添加箭头到线段结束的位置
4. "both" 表示两端均添加箭头
arrowshape 1. 用一个三元组来指定箭头的形状,默认值是 (8, 10, 3),元组中的数值分别代表箭头中三条边的长度
capstyle

1. 指定线段两端的样式,默认值是 "butt"

2. 该选项的值可以是:

"butt"(线段的两段平切于起点和终点)

"projecting"(线段的两段在起点和终点的位置将 width 选项设置的长度分别延长一半)

"round"(线段的两段在起点和终点的位置将 width设置的长度分别延长一半,并以圆角进行绘制)

dash 绘制虚线,该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔,比如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 指定虚线开始的偏移位置,比如 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
fill 1. 指定填充的颜色,空字符串表示透明
joinstyle

1. 指定当绘制两个相邻线段之间时接口的样式,默认为 "round"

2. 该选项的值可以是:

"round"(以连接点为圆心,1/2 width 选项设置的长度为半径来绘制圆角)

"bevel"(在连接点处将两线段的夹角做平切操作)

"miter"(沿着两线段的夹角延伸至一个点)

offset 指定当点画模式时填充位图的偏移
smooth 默认值为 False,若设置为 True,表示将以曲线的样式代替所绘线段
splinesteps 当绘制曲线的时,该选项指定由多少条折线来构成曲线,默认值是 12,这里需要注意,只有当 smooth 选项为 True 时该选项才会生效。
state 指定该画布对象的状态,默认值为 "normal",参数值有 "normal","disabled"(不可用)和 "hidden"(隐藏)三种状态。
stipple 指定一个位图进行填充,默认值为空字符串,表示实心
tags 为创建的画布对象添加标签
width 指定边框的宽度

对于扇形、矩形、三角形、圆形等,这些封闭式图形,它们由轮廓线和填充颜色两部分组成。在绘制这些图形时相关函数的可选参数与上述表格也存在略微差异,下面以绘制扇形的 create_arc() 函数为例做简单的介绍:

属性 方法
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activeoutline 当画布对象状态为 "active" 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 "active" 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
dash 指定绘制虚线轮廓,与绘制线段的含义相同
dashoffset 指定虚线轮廓开始的偏移位置
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledoutline 当画布对象状态为 "disabled" 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 "disabled" 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
extent 指定跨度(从 start 选项指定的位置开始到结束位置的角度)默认值是 90.0
fill 与上述表格的含义相同,表示指定的填充颜色,若为空字符串则为透明色
offset 指定当点画模式时填充位置的偏移,参数值为 "x,y"坐标偏移和位置偏移两种方式,比如 "ne"/"e" 等
outline 指定轮廓的颜色
outlineoffset 指定当点画模式绘制轮廓时位图的偏移
outlinestipple 当 outline 选项被设置时,该选项用于指定一个位图来填充边框,默认值是空字符串,表示黑色
start 指定起始位置的偏移角度
style  默认创建的是扇形,指定该方法创建的是扇形("pieslice")、弓形("chord")还是弧形("arc")
tags 为创建的画布对象添加标签
width 指定边框的宽度

下面让我们来一组绘制几何图形的简单示例:

from tkinter import *
root = Tk()
# 设置主窗口区的背景颜色以区别画布区的颜色
root.config(bg='#8DB6CD')
root.title("艾派森")
root.geometry('500x400')
root.iconbitmap('favicon.ico')
# 将画布设置为白色
canvas = Canvas(root,width = 400,height = 400,bg='white')
# 设置基准坐标
x0,y0,x1,y1 = 10,10,80,80
# 绘制扇形,起始角度为 0 度,结束角度为 270, 扇形区域填充色为淡蓝色,轮廓线为蓝色,线宽为 2px
arc = canvas.create_arc(x0, y0, x1, y1,start = 0, extent = 270, fill = '#B0E0E6',outline ='blue',width = 2)
# 绘制圆形
oval = canvas.create_oval(x0+150, y0, x1+150, y1,fill ='#CD950C',outline = 'blue',width=2)
# 绘制矩形,并将轮廓线设置为透明色,即不显示最外围的轮廓线,默认为黑色
rect = canvas.create_rectangle(x0,y0+100,x1,y1+100,fill='red',outline = '')
# 绘制一个三角形,填充色为绿色
trigon = canvas.create_polygon(80,80,150,80,200,200, outline="", fill="green",)
# 当然也可以绘制一个任意多边形,只要你的坐标正确就可以
# 绘制一个多边形,首先定义一系列的多边形上的坐标点
poly_points=[(0,280),(140,200),(140,240),(270,240),(270,320),(140,320),(140,360)]
polygon = canvas.create_polygon(poly_points,fill="#BF3EFF")
# 放置画布在主窗口
canvas.pack()
# 显示窗口
root.mainloop()

image.png

注意:create_rectangle() 方法的前两个参数决定了矩形的左上角坐标,后两个参数决定了矩形的右下角坐标;另外 create_oval() 方法并不是只能绘制圆形,还能绘制椭圆形,这取决于传入的参数。

Menu菜单控件

Menu 控件(菜单控件)可以说是 GUI 中“精髓所在”,它以可视化的方式将一系列的“功能选项卡”进行分组,并在每个分组下又“隐藏”了许多其他的“选项卡”。当打开菜单时,这些选项卡就会“显式”的呈现出来,方便用户进行选择,比如 Windows 系统中记事本文件(.txt文件类型)的界面:

image.png

通过使用菜单控件(Menu)可以充分地节省有限的窗口区域,让我们的界面更加简洁优雅,避免臃肿、混乱。 Tkinter Menu 控件提供了三种类型的菜单,分别是:topleve(主目录菜单)、pull-down(下拉式菜单)、pop-up(弹出式菜单,或称快捷式菜单)。

下表列出创建菜单时用到的相关方法,如下所示:

方法 说明
add_cascade(**options) 添加一个父菜单,将一个指定的子菜单,通过 menu 参数与父菜单连接,从而创建一个下拉菜单。
add_checkbutton(**options) 添加一个多选按钮的菜单项
add_command(**options)  添加一个普通的命令菜单项
add_radiobutton(**options) 添加一个单选按钮的菜单项
add_separator(**options)  添加一条分割线
add(add(itemType, options)) 添加菜单项,此处 itemType 参数可以是以下几种:"command"、"cascade",
"checkbutton"、"radiobutton"、"separator" 五种,并使用 options 选项来设置
菜单其他属性。

除了上述方法之外,Menu 控件也提供了一些其他方法来操作菜单项,比如删除菜单项、获取菜单项、设置指定的菜单项等,如下表所示:

方法 说明
delete(index1, index2=None) 1. 删除 index1 ~ index2(包含)的所有菜单项
2. 如果忽略 index2 参数,则删除 index1 指向的菜单项
entrycget(index, option) 获得指定菜单项的某选项的值
entryconfig(index, **options) 设置指定菜单项的选项
index(index) 返回与 index 参数相应的选项的序号
insert(index, itemType, **options)

插入指定类型的菜单项到 index 参数指定的位置,类型可以是

是:"command","cascade","checkbutton","radiobutton"

或 "separator" 中的一个,或者也可以使用 insert_类型() 形式来,

比如 insert_cascade(index, **options)..等

invoke(index) 调用 index 指定的菜单项相关联的方法
post(x, y) 在指定的位置显示弹出菜单
type(index) 获得 index 参数指定菜单项的类型
unpost() 移除弹出菜单
yposition(index) 返回 index 参数指定的菜单项的垂直偏移位置

下面对 Menu 控件的 options 参数做简单地介绍,如下所示:

属性 说明
accelerator 1. 设置菜单项的快捷键,快捷键会显示在菜单项目的右边,比如 accelerator = "Ctrl+O" 表示打开;
2. 注意,此选项并不会自动将快捷键与菜单项连接在一起,必须通过按键绑定来实现
command 选择菜单项时执行的 callback 函数
label 定义菜单项内的文字
menu 此属性与 add_cascade() 方法一起使用,用来新增菜单项的子菜单项
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
state 定义菜单项的状态,可以是 normal、active 或 disabled
onvalue/offvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0,设置 offvalue/onvalue 的值可以自定义未选中状态的值
2. 
tearoff 1. 如果此选项为 True,在菜单项的上面就会显示一个可选择的分隔线;
2. 注意:分隔线会将此菜单项分离出来成为一个新的窗口
underline 设置菜单项中哪一个字符要有下画线
value 1. 设置按钮菜单项的值
2. 在同一组中的所有按钮应该拥有各不相同的值
3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮
variable 当菜单项是单选按钮或多选按钮时,与之关联的变量

创建主目录菜单

主目录菜单也称之为“顶级菜单”,下拉菜单等其他子菜单的都需要建立在“顶级菜单”的基础之上,下面示例创建了一个类似于“记事本”界面的程序,代码如下:

from tkinter import *
import tkinter . messagebox
#创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("艾派森")
win.geometry('450x350+300+200')
win.iconbitmap('favicon.ico')
# 绑定一个执行函数,当点击菜单项的时候会显示一个消息对话框
def menuCommand() :
    tkinter.messagebox.showinfo("主菜单栏","你正在使用主菜单栏")
# 创建一个主目录菜单,也被称为顶级菜单
main_menu = Menu(win)
#新增命令菜单项,使用 add_command() 实现
main_menu.add_command(label="文件",command=menuCommand)
main_menu.add_command(label="编辑",command=menuCommand)
main_menu.add_command(label="格式",command=menuCommand)
main_menu.add_command(label="查看",command=menuCommand)
main_menu.add_command(label="帮助",command=menuCommand)
#显示菜单
win.config(menu=main_menu)
win.mainloop()

image.png

如上图所示,当点击主目录中的任意一个菜单选项时都会跳出一个消息对话框。


创建下拉菜单


下拉菜单时主菜单的重要组成部分,也是用户选择相关命令的重要交互界面,下拉菜单的创建方式也非常简单,不过需要我们注意,下拉菜单是建立的主菜单(即顶级菜单)的基础之上的,并非主窗口之上,这一点千万不要搞混,否则创建下拉菜单会失败。

下面继续仿照“记事本”的相关功能来创建下拉菜单,示例如下:

from tkinter import *
import tkinter .messagebox
#创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("艾派森")
win.geometry('450x350+300+200')
win.iconbitmap('favicon.ico')
#创建一个执行函数,点击下拉菜单中命令时执行
def menuCommand() :
    tkinter .messagebox .showinfo("下拉菜单", "您正在使用下拉菜单功能")
#创建主目录菜单(顶级菜单)
mainmenu = Menu (win)
#在顶级菜单上新增"文件"菜单的子菜单,同时不添加分割线
filemenu = Menu (mainmenu, tearoff=False)
#新增"文件"菜单的菜单项,并使用 accelerator 设置菜单项的快捷键
filemenu.add_command (label="新建",command=menuCommand,accelerator="Ctrl+N")
filemenu.add_command (label="打开",command=menuCommand, accelerator="Ctrl+O")
filemenu.add_command (label="保存",command=menuCommand, accelerator="Ctrl+S")
# 添加一条分割线
filemenu.add_separator ()
filemenu.add_command (label="退出",command=win. quit)
#在主目录菜单上新增"文件"选项,并通过menu参数与下拉菜单绑定
mainmenu.add_cascade (label="文件",menu=filemenu)
# 将主菜单设置在窗口上
win.config (menu=mainmenu)
# 绑定键盘事件,按下键盘上的相应的键时都会触发执行函数
win.bind("<Control-n>",menuCommand)
win. bind("<Control-N>", menuCommand)
win.bind("<Control-o>",menuCommand)
win. bind("<Control-O>", menuCommand)
win. bind("<Control-s>", menuCommand)
win.bind("<Control-S>",menuCommand)
# 显示主窗口
win.mainloop()

image.png

创建弹出菜单栏

弹出式菜单栏,也称为快捷式菜单栏,比如通过点击鼠标右键弹出一个菜单栏,其中包含一些常用的选项卡,如复制、粘贴等.

Tkinter Menu 控件同样可以是实现上述功能,而且并不复杂,示例如下:

import tkinter as tk
root = tk.Tk()
root.config(bg='#8DB6CD')
root.title("艾派森")
root.geometry('400x300')
root.iconbitmap('favicon.ico')
def func():
    print('您通过弹出菜单执行了命令')
# 创建一个弹出菜单
menu = tk.Menu(root, tearoff=False)
menu.add_command(label="新建", command=func)
menu.add_command(label="复制", command=func)
menu.add_command(label="粘贴", command=func)
menu.add_command(label="剪切", command=func)
# 定义事件函数
def command(event):
    # 使用 post()在指定的位置显示弹出菜单
    menu.post(event.x_root, event.y_root)
# 绑定鼠标右键,这是鼠标绑定事件
# <Button-3>表示点击鼠标的右键,1 表示左键,2表示点击中间的滑轮
root.bind("<Button-3>", command)
root.mainloop()

image.png

Scrollbar滚动条控件

Scrollbar 控件常用于创建一个水平或者垂直的滚动条,通常情况下,Scrollbar 控件可以与 Listbox、Text、Canvas 以及 Entry 等控件一起使。

滚动条控件是 GUI  程序中经常使用的一种控件类型,它主要用来控制控件区域的可见范围,比如当 Text 控件的文本内容非常多时,为了方便用户阅读,可以给 Text 控件增加滚动条,用户只需拖动滚动条就能完成内容的阅读。

Scrollbar 控件的常用属性,如下表所示:

属性 说明
activebackground 指定当鼠标在上方飘过的时候滑块和箭头的背景颜色,默认由系统决定
activerelief 指定当鼠标在滑块上方飘过时滑块的样式,默认值是 "raised",其他可选值有 "flat","sunken","groove","ridge"
background(bg) 指定背景颜色,默认值由系统指定
borderwidth(bd) 指定边框宽度,默认值是 0
command 当滚动条更新时回调的函数,通常指定对应组件的 xview() 或 yview() 方法
cursor 指定当鼠标在上方飘过的时的鼠标样式,默认值由系统指定
elementborderwidth 1. 指定滚动条和箭头的边框宽度
2. 默认值是 -1(表示使用 borderwidth 选项的值)
jump 1. 指定当用户拖拽滚动条时的行为
2. 默认值为 False,滚动条的任何一丝变动都会即刻调用 command 指定的回调函数
3. 设置为 True 则当用户松开鼠标才调用
orient 指定绘制 "horizontal"(垂直滚动条)还是 "vertical"(水平滚动条),默认值是 VERTICAL
repeatdelay 该选项指定鼠标左键点击滚动条凹槽的响应时间,默认值是 300(毫秒)
repeatinterval 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔,默认值是 100(毫秒)
takefocus 指定使用 Tab 键可以将焦点移到该 Scrollbar 组件上,默认为开启,可以将该选项设置为 False 避免焦点在此组件上
troughcolor 指定凹槽的颜色,默认由系统指定
width 指定滚动条的宽度,默认值是 16px

下面是介绍了 Scrollbar 控件常用的函数:

属性 说明
activate(element)  1. 显示 element 参数指定的元素的背景颜色和样式;
2. element 参数可以设置为:"arrow1"(箭头1),"arrow2"(箭头2)或 "slider"(滑块)
delta(deltax, deltay) 1. 给定一个鼠标移动的范围 deltax 和 deltay,然后该方法返回一个浮点类型的值(范围 -1.0 ~ 1.0)
2. 注意:deltax 表示水平移动量,deltay 表示垂直移动量
fraction(x, y) 给定一个像素坐标 (x, y),该方法返回最接近给定坐标的滚动条位置。
get()  返回当前滑块的位置 (a, b),其中 a 值表示当前滑块的顶端或左端的位置,b 值表示当前滑块的底端或右端的位置。
identify(x, y) 1. 返回一个字符串表示指定位置下(如果有的话)的滚动条部件,
2. 返回值可以是:"arrow1"(箭头1),"arrow2"(箭头2)、"slider"(滑块)或 ""(空)
set(*args) 1. 设置当前滚动条的位置
2. 该方法有两个参数即 (first, last),其中 first 表示当前滑块的顶端或左端的位置,last 表示当前滑块的底端或右端的位置(范围 0.0 ~ 1.0)

下面看一组简单的示例:

from tkinter import *
root = Tk()
root.title("艾派森")
root.geometry('450x180+300+200')
root.iconbitmap('favicon.ico')
# 创建一个滚动条控件,默认为垂直方向
sbar1= Scrollbar(root)
# 将滚动条放置在右侧,并设置当窗口大小改变时滚动条会沿着垂直方向延展
sbar1.pack(side=RIGHT, fill=Y)
# 创建水平滚动条,默认为水平方向,当拖动窗口时会沿着X轴方向填充
sbar2 = Scrollbar(root, orient=HORIZONTAL)
sbar2.pack(side=BOTTOM, fill=X)
# 创建列表框控件,并添加两个滚动条(分别在垂直和水平方向),使用 set() 进行设置
mylist = Listbox(root,xscrollcommand = sbar2.set,yscrollcommand = sbar1.set)
for i in range(30):
    mylist.insert(END,'第'+ str(i+1)+'次:'+'百度网址为:www.baidu.com'+ '\n' )
# 当窗口改变大小时会在X与Y方向填满窗口
mylist.pack(side=LEFT,fill = BOTH)
# 使用 command 关联控件的 yview、xview方法
sbar1.config(command = mylist.yview)
sbar2.config(command = mylist.xview)
#  显示主窗口
root.mainloop()

image.png

通过滑动滚动条可以浏览列表框中的内容,垂直方向的滚动条沿着上下浏览,水平方向的滚动条则沿着左右方向浏览。

Event事件处理

事件处理,是 GUI 程序中不可或缺的重要组成部分,相比来说,控件只是组成一台机器的零部件, 而事件处理则是驱动这台机器“正常”运转的关键所在,它能够将零部件之间“优雅”的贯穿起来,因此“事件处理”可谓是 GUI 程序的“灵魂”,同时它也是实现人机交互的关键。在一款 GUI 程序中,我们将用户对软件的操作统称为“事件”,比如鼠标点击按钮、键盘输入文本以及窗口管理器触发的重绘事件等,这些事件有一个共同的特点,即都是由用户直接或者间接触发的。


事件绑定方法


Tkinter 提供的事件处理机制允许我们为“控件”绑定相应的事件和事件处理函数(即 callback函数),从而实现控件与用户的交互,其语法格式如下:

widget.bind("<event>",func)

上述语法中,widget 代表控件的实例对象,之后,采用 bind() 方法进行事件绑定,该函数有两个参数:


<event>:一个字符串参数,表示事件的类型,并使用“尖括号”的形式进行包裹;

func:表示事件的处理函数(callback,即回调函数),当触发事件时,Tk 会携带事件对象(Event)去调用 func 方法。

注意:bind() 方法可以完成事件与处理函数绑定,而使用 unbind() 方法可以将事件与处理函数解绑。


常用事件类型

事件类型(也称事件码)是 Tkinter 模块规定的,主要包括鼠标、键盘、光标等相关事件,Tkinter 为其规定了相应的语法格式:

<modifier-type-detail>

上述语法由三部分组成,说明如下:


<>:事件类型必须包含在“尖括号”内;

modifier:可选项,事件类型的修饰符,通常用于描述组合键、双击<Double-Button-1>、大写锁定键<Lock>以及<Alt-Shift>等;

type:是必不可少的一项,表示事件的具体类型;

detail:可选项,通常用于描述具体的哪个按键,比如 <Button-1> 表示鼠标左键;

这里有必要对经常使用的 modifier 修饰符做简单的介绍,修饰符可以修改事件的激活条件,比如双击鼠标或者需要同时按下某个键才触发事件,常用的修饰符如下:

修饰符 说明
Control 事件发生时需按下 Control 键
Alt 事件发生时需按下 Alt 键
Shift 事件发生时需按下 Shift 键
Lock 事件发生时需处于大写锁定状态
Double 事件连续发生两次,比如双击鼠标
Triple 事件连续发生三次
Quadruple 事件连续发生四次

下述表格中介绍了 Tkinter 中经常使用的事件类型,如下所示:

事件码 说明
<ButtonPress-1> 单击鼠标左键,简写为<Button-1>,后面的数字可以是1/2/3,分别代表左键、中间滑轮、右键
<ButtonRelease-1> 释放鼠标左键,后面数字可以是1/2/3,分别代表释放左键、滑轮、右键
<B1-Motion> 按住鼠标左键移动,<B2-Motion>和<B3-Motion>分别表示按住鼠标滑轮移动、右键移动
<MouseWheel> 转动鼠标滑轮
<Double-Button-1> 双击鼠标左键
<Enter> 鼠标光标进入控件实例
<Leave> 鼠标光标离开控件实例
<Key> 按下键盘上的任意键
<KeyPress-字母>/<KeyPress-数字> 按下键盘上的某一个字母或者数字键
<KeyRelease> 释放键盘上的按键
<Return> 回车键,其他同类型键有<Shift>/<Tab>/<Control>/<Alt>
<Space> 空格键
<UP>/<Down>/<Left>/<Right> 方向键
<F1>...<F12> 常用的功能键
<Control-Alt> 组合键,再比如<Control-Shift-KeyPress-T>,表示用户同时点击 Ctrl + Shift + T
<FocusIn> 当控件获取焦点时候触发,比如鼠标点击输入控件输入内容,可以调用 focus_set() 方法使控件获得焦点
<FocusOut> 当控件失去焦点时激活,比如当鼠标离开输入框的时候
<Configure > 控件的发生改变的时候触发事件,比如调整了控件的大小等
<Deactivate> 当控件的状态从“激活”变为“未激活”时触发事件
<Destroy> 当控件被销毁的时候触发执行事件的函数
<Expose> 当窗口或组件的某部分不再被覆盖的时候触发事件
<Visibility> 当应用程序至少有一部分在屏幕中是可见状态时触发事件


目录
相关文章
|
7月前
|
监控 安全 数据可视化
情报搜集神器:Spiderfoot 保姆级教程
情报搜集神器:Spiderfoot 保姆级教程
|
6月前
|
存储 Python 容器
Python以及基础语法保姆级教程(超详细)-2
Python以及基础语法保姆级教程(超详细)
|
6月前
|
数据安全/隐私保护 Python
Python以及基础语法保姆级教程(超详细)-3
Python以及基础语法保姆级教程(超详细)
|
3月前
|
Python Windows
python入门保姆级教程 | 13
python入门保姆级教程 | 13
|
6月前
|
机器学习/深度学习 Linux 开发者
Python以及基础语法保姆级教程(超详细)-1
Python以及基础语法保姆级教程(超详细)
|
7月前
|
存储 编译器 程序员
【C++入门篇】保姆级教程篇【中】
【C++入门篇】保姆级教程篇【中】
|
7月前
|
安全 编译器 程序员
【C++入门篇】保姆级教程篇【上】
【C++入门篇】保姆级教程篇【上】
|
7月前
|
XML 网络协议 搜索推荐
情报搜集神器:theHarvester 保姆级教程(附链接)
情报搜集神器:theHarvester 保姆级教程(附链接)
|
编译器 C语言 C++
【C++入门篇】保姆级教程篇【下】
【C++入门篇】保姆级教程篇【下】
|
关系型数据库 Java 数据库连接
MyBatus-Plus保姆级快速上手教程
MyBatus-Plus保姆级快速上手教程
85 0