这一节我们将介绍Python内置的图形界面编程模块tkinter,tkinter是Python标准的GUI编程接口,可以良好的运行在大多数的系统平台中,只需要安装好Python就可以导入tkinter模块并使用,无需安装第三方库。
tkinter的主要学习内容分为四个部分:tkinter组件,数据显示,布局以及鼠标事件。本节介绍的内容为tkinter控件,具体的内容为:主窗体,Lable控件,Button控件,Entry控件,Text控件。
1.主窗体
tkinter的所有控件都需要盛放在一个容器中,这个容器就是主窗体,在创建控件之前都必须要创建主窗体。主窗体的创建过程如下代码:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("400x300+120+50")#设置窗体的位置和大小
win.mainloop()#显示生成的主窗体
如上代码,使用模块tkinter的方法Tk()创建一个窗体;title()方法设置窗体的标题;geometry()设置窗体的长宽和位置,字符串"400x300+120+50"为将窗体设置为长400px,宽300px,左上角顶点坐标位置为(120,50);方法mainloop()为将创建的窗体显示出来。
结果如下:
2.Lable控件
Lable控件的主要功能为显示文本内容,也是GUI编程中常用的基本控件,Label主要学习内容为控件的各种属性,下面我们通过例子来一一讲解这些属性。代码如下:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("400x300+120+50")#设置窗体的位置和大小
# Lable控件
label=tkinter.Label(win,#设置子控件Lable的父容器为主窗体win
text="My name is LiMing",#Lable显示的文本内容
bg="red",#Lable的背景颜色
font=("黑体",20),#Lable显示文本的颜色和字体
width=10,#Lable控件的宽度
height=10,#Lable控件的长度
wraplength=50,#每wraplength宽度的文本换行一次
justify="left",#文本显示的方向,right为从右至左显示文本,left为从左至右显示文本
anchor="center")#文本显示内容在Lable中的位置,
# 一共有n,s,e,w,ne,nw,se,sw,center九个方向,
# 分别对应北,南,东,西,东北,西北,东南,西南,中心
label.pack()#将子控件lable挂载到主窗体
win.mainloop()#显示生成的主窗体
如上,使用tkinter模块的Label()方法创建一个Label控件,首先需要指定父容器,所谓父容器通俗的含义就是子控件放在哪个父控件中显示,这里指定Label的父容器为主窗体win;接着,可以使用Label控件的各种属性设置文本内容显示的样式。如text属性设置文本显示的内容,bg设置Label的背景颜色等等。如上的注释,可以清楚的看到Label各种属性及其作用和含义。学习tkinter的各种控件,了解其属性的使用是一个重要内容。
代码结果如下:
3.Button控件
Button控件为常见的按钮,功能主要为点击按钮后响应相应的操作。如下代码:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("400x300+120+50")#设置窗体的位置和大小
def func():#点击按钮后响应的函数
print("您点击了按钮")
# Button控件
button=tkinter.Button(win,#设置子控件Button的父容器为主窗体win
text="button",#设置Button按钮显示的文本内容
command=func,#设置点击按钮后响应的事件,这里点击按钮后会执行函数func
width=10,#设置按钮的宽度
height=4)#设置按钮的长度
button.pack()#将Button控件挂载到主窗体上
win.mainloop()#显示生成的主窗体
如上代码,Button中涉及的属性有text,command,width,height等等。其实,这些都是很多控件通用的属性,如text为设置在控件上显示的文本内容,command为设置点击控件后需要响应的函数操作,这里command=func,表示点击按钮后会执行函数func()。代码运行结果如下:
点击按钮执行函数func()后的打印结果如下:
4.Entry控件
Entry是一个文本输入框控件,用于文本的输入,主要功能为接收用户向应用程序传达的消息。以下是一个Entry控件的案例及代码注释:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("400x300+120+50")#设置窗体的位置和大小
#Entry控件
e=tkinter.Variable()#创建一个变量e
entry=tkinter.Entry(win,#设置Entry控件的父容器为win
# show="*",#设置输入框为密码框
textvariable=e)#将变量e与控件entry绑定
e.set("我是输入框")#设置输入框对象的文本内容
print("e.get:",e.get())#通过与Entry控件绑定的变量e获取输入内容
print("entry.get:",entry.get())#通过Entry对象直接获取文本框内容
entry.pack()#将Entry控件挂载到父控件窗体上
win.mainloop()#显示生成的主窗体
如上代码,使用tkinter模块的Entry()方法创建一个文本输入框,那么应用程序如何获知用户在文本框中的输入内容呢?这里有两种方法:
第一种方法,直接调用Entry对象的get()方法获取文本内容,如上entry.get()。但这种方法的局限性在于,只能获取文本框的内容,并不能实时的修改文本内容。
第二种方法为,将Entry对象与一个变量var绑定,所有对文本内容的读写都是在基于var进行的,var就相当于用户与文本框进行信息交流的窗口。
如上,首先我们通过tkinter模块的Variable()方法创建一个变量e;
然后,将entry对象的textvariable的属性值设置为e,此时文本框对象entry与e绑定起来;
最后,通过变量e对文本框进行读写操作,如e.get()为获取entry对象的文本内容,e.set()为设置entry对象的文本内容。此时,文本框entry的内容由与之绑定的变量e操控,显然第二种方法将控件与文本输入数据分离开,操作的灵活性更强。
程序运行结果如下:
对输入框文本内容读取的打印结果如下:
文本输入框Entry还有一个重要属性show,当用户输入的内容为密码时,就用到了它。show="*"时,用户输入的内容不再可见,而是成为密码形式的"******"字符串。如下为当属性show="*"时的程序运行结果:
5.Text控件
之前介绍过的Entry控件只适用于用户输入少量的,重要的文本。当我们需要输入并编辑大量的文本时,如发送一封邮件,就需要使用Text多文本输入控件。可以将Text控件类比于Windows操作系统的txt文档编辑器。如下例子,Text控件可看作为把txt编辑器内嵌入程序主窗体中。
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("200x100+120+50")#设置窗体的位置和大小
# Text控件
text=tkinter.Text(win,#设置Text控件的父容器为win
width=20,
height=5)
str='''There are moments in life when you miss
someone so much that you just want to pick them
from your dreams and hug them for real! Dream
what you want to dream;go where you want to go;
be what you want to be,because you have only one
life and one chance to do all the things you want to do.
'''
text.insert(tkinter.INSERT,str)#为text文本框添加文本内容str
text.pack()#将text文本框挂载到父容器
win.mainloop()#显示生成的主窗体
如上,通过tkinter模块的Text()方法创建了一个多文本输入对象text,并设置其宽和高。Text对象的一个很常用的方法就是insert(),用于向多文本输入框中插入文本,如上对象text调用insert()方法插入文本内容,参数tkinter.INSERT表示向文本插入文本str。代码执行的结果如下:
通过观察可以发现,文本内容并不能完全显示,这是因为整个文本的长和宽大于Text控件的长和宽,导致只能部分显示文本。类比于txt编辑器,当文本内容溢出时,我们可以使用滑动条,通过滑动来显示溢出部分的文本。添加滑动条后的代码如下:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("200x100+120+50")#设置窗体的位置和大小
# Text控件
text=tkinter.Text(win,#设置Text控件的父容器为win
width=20,
height=5)
str='''There are moments in life when you miss
someone so much that you just want to pick them
from your dreams and hug them for real! Dream
what you want to dream;go where you want to go;
be what you want to be,because you have only one
life and one chance to do all the things you want to do.
'''
text.insert(tkinter.INSERT,str)#为text文本框添加文本内容str
scroll=tkinter.Scrollbar()#创建一个滑动条
text.pack(side=tkinter.LEFT,fill=tkinter.Y)#设置文本框在父容器的左侧,
# 文本框在父容器的Y方向充满
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y)#设置滑动条在父容器的右侧,
# 滑动条在父容器的Y方向上充满
win.mainloop()#显示生成的主窗体
如上,我们通过tkinter模块的Scrollbar()方法创建了一个滑动条,side=tkinter.LEFT表明将滑动条scroll显示在父容器(主窗体win)的右侧,fill=tkinter.Y表明滑动条scroll在Y方向上充满父容器。同理,调用pack()方法使得多文本框text显示在父容器的左侧,并在Y方向上充满父容器win。程序执行结果如下:
添加滑动条后,只是将滑动条显示出来。拉动后溢出的文本并没有随滑动条的移动而显示出来,这是因为文本框与滑动条只是独立的存在,并没有相互关联起来。二者之间应该存在两种关联:
第一,移动滑动条,文本随滑动条移动的方向移动;
第二,移动文本,滑动条随文本移动的方向移动。
若要产生这两种关联,就需要两者之间相互配置。代码如下:
import tkinter
win=tkinter.Tk()#创建一个窗体
win.title("MyWindow")#为窗体添加一个标题
win.geometry("200x100+120+50")#设置窗体的位置和大小
# Text控件
text=tkinter.Text(win,#设置Text控件的父容器为win
width=20,
height=5)
str='''There are moments in life when you miss
someone so much that you just want to pick them
from your dreams and hug them for real! Dream
what you want to dream;go where you want to go;
be what you want to be,because you have only one
life and one chance to do all the things you want to do.
'''
text.insert(tkinter.INSERT,str)#为text文本框添加文本内容str
scroll=tkinter.Scrollbar()#创建一个滑动条
text.pack(side=tkinter.LEFT,fill=tkinter.Y)#设置文本框在父容器的左侧,
# 文本内容str在Text控件Y方向充满
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y)#设置滑动条在父容器的右侧,
# 滑动条在父容器的Y方向上充满
scroll.config(command=text.yview)#配置滑动条scroll随文本text移动的方向移动
text.config(yscrollcommand=scroll.set)#配置文本text随滑动条scroll移动的方向移动
win.mainloop()#显示生成的主窗体
如上代码,我们在之前代码的基础上对滑动条scroll和文本text之间的关联做出了相应的配置。如:scroll.config(command=text.yview),即为当文本text在y方向上发生移动事件时,滑动条会做出随之移动的响应;text.config(yscrollcommand=scroll.set),即为text会在Y方向上随滑动条移动。程序的运行结果如下:
经过对滑动条scroll和文本text的相互配置,实现了两者间一方移动,另一方随之移动的效果。当然还可以在X方向上设置滑动条,这样就可以显示在X方向上的溢出文本。真正实现txt文档编辑器的效果。
以上就是这一节tkinter控件的内容,我们介绍了文本显示控件Label,按钮控件Button,文本输入控件Entry,多行文本输入控件Text。通过对这四种控件介绍可以发现,其实控件的学习有关原理性的内容并不是很多,只是需要我们熟练的掌握控件的属性和使用方法即可。
下一节,我们将继续介绍tkinter GUI编程,敬请期待。