零基础学Python【二十三、图形化界面设计 】(基础一篇全,欢迎认领)
1、图形化界面设计的基本理解
当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI)。
即通过鼠标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图型化显示容器中获取人机对话信息。
Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。
其图像化编程的基本步骤通常包括:
- 导入 tkinter 模块
- 创建 GUI 根窗体
- 添加人机交互控件并编写相应的函数。
- 在主事件循环中等待用户触发事件响应。
2、窗体控件布局
根窗体是图像化应用程序的根控制器,是tkinter的底层控件的实例。
当导入tkinter模块后,调用 Tk()方法可初始化一个根窗体实例 root ,用 title() 方法可设置其标题文字,用geometry()方法可以设置窗体的大小(以像素为单位)。
将其置于主循环中,除非用户关闭,否则程序始终处于运行状态。
执行该程序,一个窗体就呈现出来了。
在这个主循环的根窗体中,可持续呈现中的其他可视化控件实例,监测事件的发生并执行相应的处理程序。
下面是根窗体呈现示例:
import tkinter
#声明窗体
root=tkinter.Tk()
#编辑窗体提示文字
root.title("我的第一个程序")
#设置窗体大小·注意,不是乘号*而是小写的x
#如果想设置显示位置的写法是:root.geometry("800x600+100+50")
root.geometry("800x600+100+50")
#展示窗体
root.mainloop()
3、tkinter 常用控件
控件 | 名称 | 作用 |
---|---|---|
Button | 按钮 | 单击触发事件 |
Canvas | 画布 | 绘制图形或绘制特殊控件 |
Checkbutton | 复选框 | 多项选择 |
Entry | 输入框 | 接收单行文本输入 |
Frame | 框架 | 用于控件分组 |
Label | 标签 | 单行文本显示 |
Listbox | 列表框 | 显示文本列表 |
Menu | 菜单 | 创建菜单命令 |
Message | 消息 | 多行文本标签,与Label用法类似 |
Radiobutton | 单选按钮 | 从互斥的多个选项中做单项选择 |
Scale | 滑块 | 默认垂直方向,鼠标拖动改变数值形成可视化交互 |
Scrollbar | 滑动条 | 默认垂直方向,鼠标拖动改变数值,可与Text,Listbox,Canvas等控件配合移动可视化空间 |
Text | 文本框 | 接收或输出多行文本 |
Toplevel | 新建窗体容器 | 在顶层创建新窗体 |
4、控件的共同属性
在窗体上呈现的可视化控件,通常包括尺寸、颜色、字体、相对位置、浮雕样式、图标样式和悬停光标形状等共同属性。
不同的控件由于形状和功能不同,又有其特征属性。
在初始化根窗体和根窗体主循环之间,可实例化窗体控件,并设置其属性。父容器可为根窗体或其他容器控件实例。常见的控件共同属性如下表:
属性 | 说明 | 取值 |
---|---|---|
anchor | 文本起始位置 | CENTER(默认),E,S,W,N,NE,SE,SW,NW |
bg | 背景色 | 色值,自行获取即可 |
bd | 加粗(默认2像素) | 无 |
bitmap | 黑白二值图标 | |
cursor | 鼠标悬停光标 | |
font | 字体 | 无 |
fg | 字体颜色 | 无 |
height | 高(文本控件的单位为行) | 无 |
image | 显示图像 | 无 |
padx | 水平扩展像素 | 无 |
pady | 垂直扩展像素 | 无 |
relief | 3D浮雕样式 | flat(平的)、raised(凸起的)、sunken(凹陷的)、groove(沟槽状边缘)、ridge(脊状边缘) |
state | 控件实例状态是否可用 | NORMAL(默认),DISABLED |
width | 宽(文本控件的单位为行) | 无 |
简单样式使用:
import tkinter
#声明窗体
root=tkinter.Tk()
#编辑窗体提示文字
root.title("我的第一个程序")
#设置窗体大小·注意,不是乘号*而是小写的x
#如果想设置显示位置的写法是:root.geometry("800x600+100+50")
root.geometry("800x600+100+50")
#设置文本标签label
label = tkinter.Label(root,#添加到root下text="HelloWorld",#文本设置bg="#d3fbfb",#背景`颜色fg="red",#字体颜色font=("宋体",32),#字体大小样式width=20,#宽度height=2,#高度relief="sunken")#设置浮雕样式
#设置填充布局
label.pack()
#展示窗体
root.mainloop()
属性 relief 为控件呈现出来的3D浮雕样式,有 flat(平的)、raised(凸起的)、sunken(凹陷的)、groove(沟槽状边缘)和 ridge(脊状边缘) 5种。
5、控件布局
5.1、place() 使用方法
x:指定组件的 X 坐标。x 为 0 代表位于最左边。
y:指定组件的 Y 坐标。y 为 0 代表位于最右边。
relx:指定组件的 X 坐标,以父容器总宽度为单位 1,该值应该在 0.0~1.0 之间,其中 0.0 代表位于窗口最左边,1.0 代表位于窗口最右边,0.5 代表位于窗口中间。
rely:指定组件的 Y 坐标,以父容器总高度为单位 1,该值应该在 0.0~1.0 之间,其中 0.0 代表位于窗口最上边,1.0 代表位于窗口最下边,0.5 代表位于窗口中间。
width:指定组件的宽度,以 pixel 为单位。
height:指定组件的高度,以 pixel 为单位。
relwidth:指定组件的宽度,以父容器总宽度为单位 1,该值应该在 0.0~1.0 之间,其中 1.0 代表整个窗口宽度,0.5 代表窗口的一半宽度。
relheight:指定组件的高度,以父容器总高度为单位 1,该值应该在 0.0~1.0 之间,其中 1.0 代表整个窗口高度,0.5 代表窗口的一半高度。
bordermode:该属性支持“inside”或“outside” 属性值,用于指定当设置组件的宽度、高度时是否计算该组件的边框宽度。
当使用 Place 布局管理容器中的组件时,需要设置组件的 x、y 或 relx、rely 选项,Tkinter 容器内的坐标系统的原点 (0,0) 在左上角,其中 X 轴向右延伸,Y 轴向下延伸,如图所示
如果通过 x、y 指定坐标,单位就是 pixel(像素);如果通过 relx、rely 指定坐标,则以整个父容器的宽度、高度为 1。不管通过哪种方式指定坐标,通过图 1 不难发现,通过 x 指定的坐标值越大,该组件就越靠右;通过 y 指定的坐标值越大,该组件就越靠下。
5.2、pack() 使用方法
是一种简单的布局方法,的默认方式将按布局语句的先后,以最小占用空间的方式自上而下地排列控件实例,并且保持控件本身的最小尺寸。
用pack() 方法不加参数排列标签。为看清楚各控件所占用的空间大小,文本用了不同长度的中英文,并设置relief="groove"的凹陷边缘属性。
import tkinter
#声明窗体
import tkinter
root = tkinter.Tk()
root.title("我的第一个程序")
root.geometry("400x400+200+200")
LabelRed = tkinter.Label(root,text="abcdefghijklmnopqrstuvwxyz",fg="Red",relief = "groove")
LabelRed.pack()
LabelGreen = tkinter.Label(root,text="一二三四五六七八九十",fg="green",relief = "groove")
LabelGreen.pack()
LabelBlue = tkinter.Label(root,text="1234567890",fg="blue",relief = "groove")
LabelBlue.pack()
root.mainloop()
使用pack()方法可设置 fill、side 等属性参数。其中,参数fill 可取值:fill=X,fill=Y或fill=BOTH,分别表示允许控件向水平方向、垂直方向或二维伸展填充未被占用控件。参数 side 可取值:side=TOP(默认),side=LEFT,side=RIGHT,side=BOTTOM,分别表示本控件实例的布局相对于下一个控件实例的方位。
#coding=utf-8
import tkinter
root = tkinter.Tk()
root.title("这是标题")
root.geometry("400x400+200+200")
LabelRed = tkinter.Label(root,text="abcdefghijklmnopqrstuvwxyz",fg="Red",relief = "groove")
LabelRed.pack()
LabelGreen = tkinter.Label(root,text="一二三四五六七八九十",fg="green",relief = "groove")
LabelGreen.pack(fill = "y",side = "right")
LabelBlue = tkinter.Label(root,text="1234567890",fg="blue",relief = "groove")
LabelBlue.pack(fill = "x",side = "bottom")
LabelBlack = tkinter.Label(root,text = "This is BlackLabel",fg = "black",relief = "groove")
LabelBlack.pack(fill = "both",side = "left")
root.mainloop()
5.3、grid() 使用方法
是基于网格的布局。先虚拟一个二维表格,再在该表格中布局控件实例。由于在虚拟表格的单元中所布局的控件实例大小不一,单元格也没有固定或均一的大小,因此其仅用于布局的定位。pack()方法与grid()方法不能混合使用。
grid()方法常用布局参数如下:
- column: 控件实例的起始列,最左边为第0列。
- columnspan: 控件实例所跨越的列数,默认为1列。
- ipadx,ipady: 控件实例所呈现区域内部的像素数,用来设置控件实例的大小。
- padx,pady: 控件实例所占据空间像素数,用来设置实例所在单元格的大小。
- row: 控件实例的起始行,最上面为第0行。
- rowspan: 控件实例的起始行数,默认为1行。
import tkinter
Win = tkinter.Tk()
Win.title("这是标题")
Win.geometry("400x400+200+200")
LabelRed = tkinter.Label(Win,text="Red",fg="Red",relief='groove')
LabelRed.grid(column=2,row=0)
LabelGreen = tkinter.Label(Win,text="绿色",fg="green",relief='groove')
LabelGreen.grid(column=0,row=1)
LabelBlue = tkinter.Label(Win,text="蓝",fg="blue",relief="groove")
LabelBlue.grid(column=1,columnspan=2,ipadx=20,row=2)
Win.mainloop()
6、tkinter常见控件的特征属性
6.1、文本输入和输出相关控件:
文本的输入与输出控件通常包括:标签(Label)、消息(Message)、输入框(Entry)、文本框(Text)。他们除了前述共同属性外,都具有一些特征属性和功能。
标签(Label)和 消息(Message):除了单行与多行的不同外,属性和用法基本一致,用于呈现文本信息。值得注意的是:属性text通常用于实例在第一次呈现时的固定文本,而如果需要在程序执行后发生变化,则可以使用下列方法之一实现:1、用控件实例的configure()方法来改变属性text的值,可使显示的文本发生变化;2、先定义一个tkinter的内部类型变量var=StringVar() 的值也可以使显示文本发生变化。
看下面的一个例子:制作一个电子时钟,用root的after()方法每隔1秒time模块以获取系统当前时间,并在标签中显示出来。
方法一:利用configure()方法或config()来实现文本变化。
import tkinter
import timedef gettime():timestr = time.strftime("%H:%M:%S") # 获取当前的时间并转化为字符串lb.configure(text=timestr) # 重新设置标签文本root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间root = tkinter.Tk()
root.title('时钟')lb = tkinter.Label(root,text='',fg='blue',font=("黑体",80))
lb.pack()
gettime()
root.mainloop()
方法二:利用textvariable变量属性来实现文本变化。
import tkinter
import timedef gettime():var.set(time.strftime("%H:%M:%S")) # 获取当前时间root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间root = tkinter.Tk()
root.title('时钟')
var=tkinter.StringVar()lb = tkinter.Label(root,textvariable=var,fg='blue',font=("黑体",80))
lb.pack()
gettime()
root.mainloop()
6.2、文本框(Text):
文本框的常用方法如下:
方法 | 功能 |
---|---|
delete(起始位置,[,终止位置]) | 删除指定区域文本 |
get(起始位置,[,终止位置]) | 获取指定区域文本 |
insert(位置,[,字符串]...) | 将文本插入到指定位置 |
see(位置) | 在指定位置是否可见文本,返回布尔值 |
index(标记) | 返回标记所在的行和列 |
mark_names() | 返回所有标记名称 |
mark_set(标记,位置) | 在指定位置设置标记 |
mark_unset(标记) | 去除标记 |
上表位置的取值可为整数,浮点数或END(末尾),例如0.0表示第0列第0行
如下一个例子:每隔1秒获取一次当前日期的时间,并写入文本框中,如下:本例中调用 datetime.now()获取当前日期时间,用insert()方法每次从文本框txt的尾部(END)开始追加文本。
from tkinter import *
import time
import datetimedef gettime():s=str(datetime.datetime.now())+'\n'txt.insert(END,s)root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间root=Tk()
root.geometry('320x240')
txt=Text(root)
txt.pack()
gettime()
root.mainloop()
6.3、输入框(Entry):
通常作为功能比较单一的接收单行文本输入的控件,虽然也有许多对其中文本进行操作的方法,但通常用的只有取值方法get()和用于删除文本的delete(起始位置,终止位置),例如:清空输入框为delete(0,END)。
语法格式如下:
w = Entry( master, option, ... )
master: 按钮的父容器。
options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。
序号 | 可选项 & 描述 |
---|---|
1 |
bg 输入框背景颜色 |
2 |
bd 边框的大小,默认为 2 个像素 |
3 |
cursor 光标的形状设定,如arrow, circle, cross, plus 等 |
4 |
font 文本字体 |
5 |
exportselection 默认情况下,你如果在输入框中选中文本,默认会复制到粘贴板,如果要忽略这个功能刻工艺设置 exportselection=0。 |
6 |
fg 文字颜色。值为颜色或为颜色代码,如:'red','#ff0000' |
7 |
highlightcolor 文本框高亮边框颜色,当文本框获取焦点时显示 |
8 |
justify 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER |
9 |
relief 边框样式,设置控件3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。 |
10 |
selectbackground 选中文字的背景颜色 |
11 |
selectborderwidth 选中文字的背景边框宽度 |
12 |
selectforeground 选中文字的颜色 |
13 |
show 指定文本框内容显示为字符,值随意,满足字符即可。如密码可以将值设为 show="*" |
14 |
state 默认为 state=NORMAL, 文框状态,分为只读和可写,值为:normal/disabled |
15 |
textvariable 文本框的值,是一个StringVar()对象 |
16 |
width 文本框宽度 |
17 |
xscrollcommand 设置水平方向滚动条,一般在用户输入的文本框内容宽度大于文本框显示的宽度时使用。 |
方法
下表为文本框组件常用的方法:
序号 | 方法 & 描述 |
---|---|
1 |
delete ( first, last=None ) 删除文本框里直接位置值 text.delete(10) # 删除索引值为10的值 text.delete(10, 20) # 删除索引值从10到20之前的值 text.delete(0, END) # 删除所有值 |
2 |
get() 获取文件框的值 |
3 |
icursor ( index ) 将光标移动到指定索引位置,只有当文框获取焦点后成立 |
4 |
index ( index ) 返回指定的索引值 |
5 |
insert ( index, s ) 向文本框中插入值,index:插入位置,s:插入值 |
6 |
select_adjust ( index ) 选中指定索引和光标所在位置之前的值 |
7 |
select_clear() 清空文本框 |
8 |
select_from ( index ) 设置光标的位置,通过索引值 index 来设置 |
9 |
select_present() 如果有选中,返回 true,否则返回 false。 |
10 |
select_range ( start, end ) 选中指定索引位置的值,start(包含) 为开始位置,end(不包含) 为结束位置start必须比end小 |
11 |
select_to ( index ) 选中指定索引与光标之间的值 |
12 |
xview ( index ) 该方法在文本框链接到水平滚动条上很有用。 |
13 |
xview_scroll ( number, what ) 用于水平滚动文本框。 what 参数可以是 UNITS, 按字符宽度滚动,或者可以是 PAGES, 按文本框组件块滚动。 number 参数,正数为由左到右滚动,负数为由右到左滚动。 |
from tkinter import *top = Tk()
L1 = Label(top, text="网站名")
L1.pack( side = LEFT)
E1 = Entry(top, bd =5)
E1.pack(side = RIGHT)top.mainloop()
6.4、按钮(Button):
主要是为响应鼠标单击事件触发运行程序所设的,故其除控件共有属性外,属性command是最为重要的属性。通常,将按钮要触发执行的程序以函数形式预先定义,然后可以用一下两种方法调用函数。Button按钮的状态有:'normal','active','disabled'
直接调用函数。参数表达式为“command=函数名”,注意函数名后面不要加括号,也不能传递参数。如下面的command=run1:
利用匿名函数调用函数和传递参数。参数的表达式为“command=lambda”:函数名(参数列表)。例如下面的:"command=lambda:run2(inp1.get(),inp2.get())"。
看下面的例子:1.从两个输入框去的输入文本后转为浮点数值进行加法运算,要求每次单击按钮产生的算是结果以文本的形式追加到文本框中,将原输入框清空。2.按钮方法一不传参数调用函数run1()实现,按钮“方法二”用lambda调用函数run2(x,y)同时传递参数实现。
from tkinter import *def run1():a = float(inp1.get())b = float(inp2.get())s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)txt.insert(END, s) # 追加显示运算结果inp1.delete(0, END) # 清空输入inp2.delete(0, END) # 清空输入def run2(x, y):a = float(x)b = float(y)s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)txt.insert(END, s) # 追加显示运算结果inp1.delete(0, END) # 清空输入inp2.delete(0, END) # 清空输入root = Tk()
root.geometry('460x240')
root.title('简单加法器')lb1 = Label(root, text='请输入两个数,按下面两个按钮之一进行加法计算')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
inp1 = Entry(root)
inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
inp2 = Entry(root)
inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)# 方法-直接调用 run1()
btn1 = Button(root, text='方法一', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)# 方法二利用 lambda 传参数调用run2()
btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)root.mainloop()
6.5、单选按钮:(Radiobutton)
是为了响应故乡排斥的若干单选项的单击事件以触发运行自定义函数所设的,该控件排除具有共有属性外,还具有显示文本(text)、返回变量(variable)、返回值(value)、响应函数名(command)等重要属性。响应函数名“command=函数名”的用法与Button相同,函数名最后也要加括号。返回变量variable=var通常应预先声明变量的类型var=IntVar()或var=StringVar(),在所调用的函数中方可用var.get()方法获取被选中实例的value值。例如下面:
from tkinter import *
def Mysel():dic = {0:'甲',1:'乙',2:'丙'}s = "您选了" + dic.get(var.get()) + "项"lb.config(text = s)root = Tk()
root.title('单选按钮')
lb = Label(root)
lb.pack()var = IntVar()
rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel)
rd1.pack()rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel)
rd2.pack()rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel)
rd3.pack()root.mainloop()
6.5、复选框:(Checkbutton)
是为了返回多个选项值的交互控件,通常不直接触发函数的执行。该控件除具有共有属性外,还具有显示文本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要属性。返回变量variable=var 通常可以预先逐项分别声明变量的类型var=IntVar() (默认)或 var=StringVar(), 在所调用的函数中方可分别调用 var.get()方法 取得被选中实例的 onvalue或offvalue值。复选框实例通常还可分别利用 select()、deselect()和 toggle() 方法对其进行选中、清除选中和反选操作。
如下的例子: 利用复选框实现,单击OK,可以将选中的结果显示在标签上。效果如下:
from tkinter import *
import tkinterdef run():if(CheckVar1.get()==0 and CheckVar2.get()==0 and CheckVar3.get()==0 and CheckVar4.get()==0):s = '您还没选择任何爱好项目'else:s1 = "足球" if CheckVar1.get()==1 else ""s2 = "篮球" if CheckVar2.get() == 1 else ""s3 = "游泳" if CheckVar3.get() == 1 else ""s4 = "田径" if CheckVar4.get() == 1 else ""s = "您选择了%s %s %s %s" % (s1,s2,s3,s4)lb2.config(text=s)root = tkinter.Tk()
root.title('复选框')
lb1=Label(root,text='请选择您的爱好项目')
lb1.pack()CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
CheckVar4 = IntVar()ch1 = Checkbutton(root,text='足球',variable = CheckVar1,onvalue=1,offvalue=0)
ch2 = Checkbutton(root,text='篮球',variable = CheckVar2,onvalue=1,offvalue=0)
ch3 = Checkbutton(root,text='游泳',variable = CheckVar3,onvalue=1,offvalue=0)
ch4 = Checkbutton(root,text='田径',variable = CheckVar4,onvalue=1,offvalue=0)ch1.pack()
ch2.pack()
ch3.pack()
ch4.pack()btn = Button(root,text="OK",command=run)
btn.pack()lb2 = Label(root,text='')
lb2.pack()
root.mainloop()
6.6、列表框 与 组合框:
列表框:(Listbox) 可供用户单选或多选所列条目以形成人机交互。列表框控件的主要方法见下面的表:
方法 | 功能描述 |
---|---|
curselection() | 返回光标选中项目编号的元组,注意并不是单个的整数 |
delete(起始位置,终止位置) | 删除项目,终止位置可省略,全部清空为delete(0,END) |
get(起始位置,终止位) | 返回范围所含项目文本的元组,终止位置可忽略 |
insert(位置,项目元素) | 插入项目元素(若有多项,可用列表或元组类型赋值),若位置为END,则将项目元素添加在最后 |
size() | 返回列表框行数 |
执行自定义函数时,通常使用“实例名.surselection()” 或 “selected” 来获取选中项的位置索引。由于列表框实质上就是将Python 的列表类型数据可视化呈现,在程序实现时,也可直接对相关列表数据进行操作,然后再通过列表框展示出来,而不必拘泥于可视化控件的方法。看下面的一个例子:实现列表框的初始化、添加、插入、修改、删除和清空操作,如下:
from tkinter import *
def ini():Lstbox1.delete(0,END)list_items = ["数学","物理","化学","语文","外语"]for item in list_items:Lstbox1.insert(END,item)def clear():Lstbox1.delete(0,END)def ins():if entry.get() != '':if Lstbox1.curselection() == ():Lstbox1.insert(Lstbox1.size(),entry.get())else:Lstbox1.insert(Lstbox1.curselection(),entry.get())def updt():if entry.get() != '' and Lstbox1.curselection() != ():selected=Lstbox1.curselection()[0]Lstbox1.delete(selected)Lstbox1.insert(selected,entry.get())def delt():if Lstbox1.curselection() != ():Lstbox1.delete(Lstbox1.curselection())root = Tk()
root.title('列表框实验')
root.geometry('320x240')frame1 = Frame(root,relief=RAISED)
frame1.place(relx=0.0)frame2 = Frame(root,relief=GROOVE)
frame2.place(relx=0.5)Lstbox1 = Listbox(frame1)
Lstbox1.pack()entry = Entry(frame2)
entry.pack()btn1 = Button(frame2,text='初始化',command=ini)
btn1.pack(fill=X)btn2 = Button(frame2,text='添加',command=ins)
btn2.pack(fill=X)btn3 = Button(frame2,text='插入',command=ins) # 添加和插入功能实质上是一样的
btn3.pack(fill=X)btn4 = Button(frame2,text='修改',command=updt)
btn4.pack(fill=X)btn5 = Button(frame2,text='删除',command=delt)
btn5.pack(fill=X)btn6 = Button(frame2,text='清空',command=clear)
btn6.pack(fill=X)root.mainloop()
组合框:(Combobox) 实质上是带文本框的上拉列表框,其功能也将是Python 的列表类型数据可视化呈现,并提供用户单选或多选所列条目以形成人机交互。在图形化界面设计时,由于其具有灵活的界面,因此往往比列表框更受喜爱。但该控件并不包含在 tkinter 模块中,而是与 TreeView、Progressbar、Separator等控件一同包含在tkinter 的子模块ttk中。如果使用该控件,应先与from tkinter import ttk 语句引用ttk子模块,然后创建组合框实例: 实例名=Combobox(根对象,[属性列表])
指定变量var=StringVar(),并设置实例属性 textvariable = var,values=[列表...]。组合框控件常用方法有:获得所选中的选项值get()和获得所选中的选项索引current()。
看下面的一个例子:实现四则运算计算器,将两个操作数分别填入两个文本框后,通过选择组合框中的算法触发运算,如下:
from tkinter.ttk import *
from tkinter import *def calc(event):a = float(t1.get())b = float(t2.get())dic = {0:a+b,1:a-b,2:a*b,3:a/b}c = dic[comb.current()]lbl.config(text=str(c))root = Tk()
root.title('四则运算')
root.geometry('320x240')t1 = Entry(root)
t1.place(relx=0.1,rely=0.1,relwidth=0.2,relheight=0.1)t2 = Entry(root)
t2.place(relx=0.5,rely=0.1,relwidth=0.2,relheight=0.1)var = StringVar()comb = Combobox(root,textvariable=var,values=['加','减','乘','除',])
comb.place(relx=0.1,rely=0.5,relwidth=0.2)
comb.bind('<<ComboboxSelected>>',calc)lbl=Label(root,text='结果')
lbl.place(relx=0.5,rely=0.7,relwidth=0.2,relheight=0.3)root.mainloop()
6.7、滑块(Scale):
是一种 直观地进行数值输入的交互控件,其主要属性见下表:
属性 | 功能描述 |
---|---|
from_ | 起始值(最小可取值) |
lable | 标签文字,默认为无 |
length | 滑块控件实例宽(水平方向)或 高(垂直方向),默认为100像素 |
orient | 滑块控件实例呈现方向,VERTCAL或HORIZONTAL(默认) |
repeatdelay | 鼠标响应延时,默认为 300ms |
resolution | 分辨精度,即最小值间隔 |
sliderlength | 滑块宽度,默认为30 像素 |
state | 状态,若设置 state=DISABLED,则滑块控件实例不可用 |
tickinterval | 标尺间隔,默认为0,若设置过小,则会重叠 |
to | 终止值(最大可取值) |
variable | 返回数值类型,可为IntVar(整数)、DoubleVar(浮点数)、或 StringVar(字符串) |
width | 控件实例本身的宽度,默认为15像素 |
滑块控件实例的主要方法比较简单,有 get()和set(值),分别为取值和将滑块设在某特定值上。滑块实例也可绑定鼠标左键释放事件<ButtoonRelease-1>,并在执行函数中添加参数event来实现事件响应。
例如:在一个窗体上设计一个200像素宽的水平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为 1,用鼠标拖动滑块后释放鼠标可读取滑块值并显示在标签上。效果如下:
from tkinter import *def show(event):s = '滑块的取值为' + str(var.get())lb.config(text=s)root = Tk()
root.title('滑块实验')
root.geometry('320x180')
var=DoubleVar()
scl = Scale(root,orient=HORIZONTAL,length=200,from_=1.0,to=5.0,label='请拖动滑块',tickinterval=1,resolution=0.05,variable=var)
scl.bind('<ButtonRelease-1>',show)
scl.pack()lb = Label(root,text='')
lb.pack()root.mainloop()
6.8、菜单:(Menu)
用于可视化地为一系列的命令分组,从而方便用户找到和触发执行这些命令。这里Menu所实例化别的主要是菜单,其通式为:
菜单实例名=Menu(根窗体)
菜单分组1=Menu(菜单实例名)
菜单实例名.add_cascade(<label=菜单分组1 显示文本>,<menu=菜单分组1>)
菜单分组1.add_command(<label=命令1文本>,<command=命令1函数名>)
其中较为常见的方法有:add_cascade()、add_command()和add_separator(),分别用于添加一个菜单分组、添加一条菜单命令和添加一条分割线。
利用Menu控件也可以创建快捷菜单(又称为上下文菜单)。通常需要右击弹出的控件实例绑定鼠标右击响应事件<Button-3>,并指向一个捕获event参数的自定义函数,在该自定义函数中,将鼠标的触发位置event.x_root 和 event.y_root以post()方法传给菜单。
例子:仿照window自带的“记事本”中的文件和编辑 菜单,实现在主菜单个快捷菜单上触发菜单命令,并相应改变窗体上的标签的文本内容。效果如下:
from tkinter import *def new():s = '新建'lb1.config(text=s)def ope():s = '打开'lb1.config(text=s)def sav():s = '保存'lb1.config(text=s)def cut():s = '剪切'lb1.config(text=s)def cop():s = '复制'lb1.config(text=s)def pas():s = '粘贴'lb1.config(text=s)def popupmenu(event):mainmenu.post(event.x_root,event.y_root)root = Tk()
root.title('菜单实验')
root.geometry('320x240')lb1 = Label(root,text='显示信息',font=('黑体',32,'bold'))
lb1.place(relx=0.2,rely=0.2)mainmenu = Menu(root)
menuFile = Menu(mainmenu) # 菜单分组 menuFile
mainmenu.add_cascade(label="文件",menu=menuFile)
menuFile.add_command(label="新建",command=new)
menuFile.add_command(label="打开",command=ope)
menuFile.add_command(label="保存",command=sav)
menuFile.add_separator() # 分割线
menuFile.add_command(label="退出",command=root.destroy)menuEdit = Menu(mainmenu) # 菜单分组 menuEdit
mainmenu.add_cascade(label="编辑",menu=menuEdit)
menuEdit.add_command(label="剪切",command=cut)
menuEdit.add_command(label="复制",command=cop())
menuEdit.add_command(label="粘贴",command=pas())root.config(menu=mainmenu)
root.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件
root.mainloop()
6.9、子窗体:
用Toplevel可新建一个显示在最前面的子窗体,其通式为: 字体实例名=Toplevel(根窗体)
,子窗体与根窗体类似,也可设置title、geomerty等属性,并在画布上布局其他控件。如下的例子:在根窗体上创建菜单,触发创建一个新的窗体
from tkinter import *def newwind():winNew = Toplevel(root)winNew.geometry('320x240')winNew.title('新窗体')lb2 = Label(winNew,text='我在新窗体上')lb2.place(relx=0.2,rely=0.2)btClose=Button(winNew,text='关闭',command=winNew.destroy)btClose.place(relx=0.7,rely=0.5)root = Tk()
root.title('新建窗体实验')
root.geometry('320x240')lb1 = Label(root,text='主窗体',font=('黑体',32,'bold'))
lb1.place(relx=0.2,rely=0.2)mainmenu = Menu(root)
menuFile = Menu(mainmenu)
mainmenu.add_cascade(label='菜单',menu=menuFile)
menuFile.add_command(label='新窗体',command=newwind)
menuFile.add_separator()
menuFile.add_command(label='退出',command=root.destroy)root.config(menu=mainmenu)
root.mainloop()
关闭窗体程序运行的方法通常用 destory(),而不建议用 quit()。用Toplevel 所创建的子窗体是非模式(Modeless)的窗体,虽然初建时子窗体在最前面,但根窗体上的控件实例也是可以被操作的。
6.10、模式对话框(Modal):
是相对于前面介绍的非模式窗体而言的,所弹出的对话框必须应答,在关闭之前无法操作其后面的其他窗体。常见的模式对话框有消息对话框、输入对话框、文件选择对话框、颜色选择对话框等。
消息对话框: 引用 tkinter.messagebox 包,可使用消息对话框函数。执行这些函数,可弹出模式消息对话框,并根据用户的响应但会一个布尔值。其通式为:
消息对话框函数(<title=标题文本>,<message=消息文本>,[其他参数])
看下面的例子:单击按钮,弹出确认取消对话框,并将用户回答显示在标签中。效果如下:
from tkinter import *
import tkinter.messageboxdef xz():answer=tkinter.messagebox.askokcancel('请选择','请选择确定或取消')if answer:lb.config(text='已确认')else:lb.config(text='已取消')root = Tk()lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出对话框',command=xz)
btn.pack()
root.mainloop()
输入对话框:
引用tkinter.simpledialog包,可弹出输入对话框,用以接收用户的简单输入。输入对话框常用 askstring()、askfloat()和askfloat() 三种函数,分别用于接收字符串、整数和浮点数类型的输入。
如下面的例子:单击按钮,弹出输入对话框,接收文本输入显示在窗体的标签上。如下:
from tkinter.simpledialog import *def xz():s=askstring('请输入','请输入一串文字')lb.config(text=s)root = Tk()lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出输入对话框',command=xz)
btn.pack()
root.mainloop()
文件选择对话框:
引用tkinter.filedialog包,可弹出文件选择对话框,让用户直观地选择一个或一组文件,以供进一步的文件操作。常用的文件选择对话框函数有 askopenfilename()、askopenfilenames()和asksaveasfilename(),分别用于进一步打开一个文件、一组文件和保存文件。其中,askopenfilename()和asksaveasfilenamme()函数的返回值类型为包含文件路径的文件名字符串,而askopenfilenames()函数的返回值类型为元组。
例如:单击按钮,弹出文件选择对话框(“打开”对话框),并将用户所选择的文件路径和文件名显示在窗体的标签上。如下:
from tkinter import *
import tkinter.filedialogdef xz():filename=tkinter.filedialog.askopenfilename()if filename != '':lb.config(text='您选择的文件是'+filename)else:lb.config(text='您没有选择任何文件')root = Tk()lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出文件选择对话框',command=xz)
btn.pack()
root.mainloop()
打开选择窗口:
选中文件:
6.11、颜色选择对话框:
引用tkinter.colorchooser包,可使用 askcolor()函数弹出模式颜色选择对话框,让用户可以个性化地设置颜色属性。该函数的返回形式为包含RGB十进制浮点元组和RGB十六进制字符串的元组类型,例如:“((135.527343.52734375,167.65234375,186.7265625)),'#87a7ba'”。通常,可将其转换为字符串类型后,再截取以十六进制数表示的RGB颜色字符串用于为属性赋值。
举例:单击按钮,弹出颜色选择对话框,并将用户所选择的颜色设置为窗体上标签的背景颜色,如下:
from tkinter import *
import tkinter.colorchooserdef xz():color=tkinter.colorchooser.askcolor()colorstr=str(color)print('打印字符串%s 切掉后=%s' % (colorstr,colorstr[-9:-2]))lb.config(text=colorstr[-9:-2],background=colorstr[-9:-2])root = Tk()lb = Label(root,text='请关注颜色的变化')
lb.pack()
btn=Button(root,text='弹出颜色选择对话框',command=xz)
btn.pack()
root.mainloop()
7、事件响应
用tkinter 可将用户事件与自定义函数绑定,用键盘或鼠标的动作事件来响应触发自定义函数的执行。其通式为:
控件实例.bind(<事件代码>,<函数名>)
其中,事件代码通常以半角小于号“<”和大于号“>” 界定,包括事件和按键等 2~3个部分,它们之间用减号分隔,常见事件代码见下表:
事件 | 事件代码 | 备注 |
---|---|---|
单击鼠标左键 | <ButtonPress-1> | 可简写为<Button-1> 或 <1> |
单击鼠标中键 | <ButtonPress-2> | 可简写为<Button-2> 或 <2> |
单击鼠标右键 | <ButtonPress-3> | 可简写为<Button-3> 或 <3> |
释放鼠标左键 | <ButtonRelease-1> | --- |
释放鼠标中键 | <ButtonRelease-2> | --- |
释放鼠标右键 | <ButtonRelease-3> | --- |
按住鼠标左键移动 | <B1-Motion> | --- |
按住鼠标中键移动 | <B2-Motion> | --- |
按住鼠标右键移动 | <B3-Motion> | --- |
转动鼠标滚轮 | <MouseWheel> | --- |
双击鼠标左键 | <Double-Button-1> | --- |
鼠标进入控件实例 | <Enter> | 注意与回车事件的区别 |
鼠标离开控件实例 | <Leave> | --- |
键盘任意键 | <Key> | --- |
字母和数字 | < Key-字母>,例如<key-a>、<Key-A> | 简写不带小于和大于号,例如:a,A和1等 |
回车 | <Return> | <Tab>,<Shift>,<Control>(注意不能用<Ctrl>),<Alt>等类同 |
空格 | <Space> | --- |
方向键 | <Up> ,<Down>,<Left>,<Right> | --- |
功能键 | <Fn>例如:<F1>等 | --- |
组合键 | 键名之间以减号链接,例如<Control-k>,<Shift-6>,<Alt-Up>等 | 注意大小写 |
例如,将框架控件实例frame 绑定鼠标右键单击事件,调用自定义函数 myfunc()可表示为"frame.bind('<Button-3>',myfunc)
",注意: myfunc后面没有括号。将控件实例绑定到键盘事件和部分光标不落在具体控件实例上的鼠标事件时,还需要设置该实例执行focus_set() 方法获得焦点,才能对事件持续响应。例如: frame.focus_set()。所调用的自定义函数若需要利用鼠标或键盘的响应值,可将event作为参数,通过event的属性获取。event的属性见下表:
event属性 | 意义 |
---|---|
x或y(注意是小写) | 相对于事件绑定控件实例左上角的坐标值(像素) |
root_x或root_y(注意是小写) | 相对于显示屏幕左上角的坐标值(像素) |
char | 可显示的字符,若按键不可显示,则返回为空字符串 |
keysysm | 字符或字符型按键名,如:“a”或“Escape” |
keysysm_num | 按键的十进制 ASCII 码值 |
例如:将标签绑定键盘任意键触发事件并获取焦点,并将按键字符显示在标签上
from tkinter import *def show(event):s=event.keysymlb.config(text=s)root=Tk()
root.title('按键实验')
root.geometry('200x200')
lb=Label(root,text='请按键',font=('黑体',48))
lb.bind('<Key>',show)
lb.focus_set()
lb.pack()
root.mainloop()
希望能给大家带来帮助,所有案例都经过多次测试,放心食用。
零基础学Python【二十三、图形化界面设计 】(基础一篇全,欢迎认领)相关推荐
- Python中Tkinter 图形化界面设计(详细教程)
Python-Tkinter 图形化界面设计(详细教程) 一.图形化界面设计的基本理解 二. 窗体控件布局 2.1 根窗体呈现示例 2.2 tkinter 常用控件 2.2.1常用控件 2.2.2 控 ...
- java 网格布局管理器,Java图形化界面设计——布局管理器之GridLayout(网格布局)...
网格布局特点: l 使容器中的各组件呈M行×N列的网格状分布. l 网格每列宽度相同,等于容器的宽度除以网格的列数. l 网格每行高度相同,等于容器的高度除以网格的行数. l 各组件的排列方式 ...
- 零基础学Python(二)
零基础学Python(二) 这一期给大家介绍一个好用的Python开发工具:Pycharm 一.Pycharm的简介: PyCharm是由JetBrains打造的一款Python IDE,是一种Pyt ...
- Python 图形化界面设计
1.图形化界面设计的基本理解 当前流行的计算机桌面应用程序大多数为图形化用户界面(Graphic User Interface,GUI),即通过鼠标对菜单.按钮等图形化元素触发指令,并从标签.对话框等 ...
- Python + Tkinter 图形化界面设计1 —— 第一个图形化界面
图形化界面设计的基本理解 Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法.其图像化编程的基本步 ...
- Java图形化界面设计——容器(JFrame)
Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...
- 图形化界面设计软件简要介绍
图形化界面设计软件简要介绍 [摘要]:面向使用者的系统工程设计,其目的是要准确.快速地在设计者和使用者之间传递信息和实现功能,也是优化产品性能来适应大众的操作能力,减轻使用者的认知负担.成功的系统工程 ...
- Python-Tkinter图形化界面设计(详细教程 )
原文链接:https://www.jianshu.com/p/91844c5bca78 声明:本篇文章为转载自https://www.jianshu.com/p/91844c5bca78,在原作者的基 ...
- Python-Tkinter图形化界面设计
综合了以下的文章: 转载自:https://www.cnblogs.com/shwee/p/9427975.html 转载自:https://www.jianshu.com/p/91844c5bca7 ...
最新文章
- MFC静态文本控件设置超链接
- iinflux数据库使用
- python打印99乘法表_Python 实例:九九乘法表
- Struts2+JFreeChart
- Axial symmetry FZU - 2035
- ASP.NET 页面生存周期概览
- 初学C语言没有项目练手怎么行,这17个小项目收下不谢
- Fedora的systemctl命令详解 Fedora配置IP地址/DNS/Networking
- app测试-兼容性测试与云测试技术
- 【报告分享】2022中国职业教育行业报告-多鲸资本.pdf(附下载链接)
- MYSQL 索引事务日志概述
- 注意!SQLite被曝漏洞,Chrome 火狐等数千应用或受影响
- 软件开发人员简历项目经验怎么写
- ArcGIS修改默认文件地理数据库
- 感觉现在的技术圈越来越像娱乐圈了
- 201771010112罗松《面向对象程序设计(java)》第十六周学习总结
- Android UI 基础知识
- 对比不同主流存储格式(csv, feather, jay, h5, parquet, pickle)的读取效率
- 萝卜新版APP一键云端打包/无需电脑/无需AS工具
- DiskPart分区工具命令详解
热门文章
- 基坑计算理论m法弹性支点法_人工冲孔轻型井点在基坑降水工程中的应用
- 一个用python做的完整项目_我从一个小项目学习Python编程的全过程(二)
- PHP 函数调用次数,php获取页面执行时间,数据库读写次数,函数调用次数等(THINKphp)的简单示例...
- 机器学习:决策树过拟合与剪枝,决策树代码实现(三)
- mysql ---- innodb-1- 体系结构、文件、表
- java并发编程之美-阅读记录10
- vue路由-router
- 洛谷 CF1043F Make It One 解题报告
- HttpClient-01基本概念
- java 线程之对象的同步和异步