Python学习(28)--tkinter图形界面编程1
这一节我们将介绍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()为将创建的窗体显示出来。
结果如下:
如上结果,窗体创建的的坐标系为:屏幕左上角顶点为坐标原点(0,0),原点向右为X轴,向下为Y轴,创建窗体时需要指定其左上角顶点的坐标和窗体的长宽,方式为调用窗体对象的geometry()方法,参数为一个字符串"widthxheight+X+Y",width指定窗体宽度,height指定窗体长度,X为窗体左上角顶点x轴坐标值,Y为窗体左上角顶点y轴坐标值。
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编程,敬请期待。