目录
1.图形用户界面概述
1.1tkinter
2.tkinter概述
2.1tkinter模块
2.2图形用户界面的构成
2.3框架和GUI应用程序类
2.4tkinter主窗口
3几何布局管理器
3.1pack几何布局管理器
3.2grid几何布局管理器
3.3place几何布局管理器
4.事件处理
4.1事件类型
4.2事件绑定
4.3事件处理函数
5.常用组件
tkinter是Tk图形用户界面工具包标准的Python接口。tkinter是Python的标准GUI库,支持跨平台的图形用户界面应用程序开发,包括Windows、Linux、UNIX和Macintosh操作系统。
thinker的特点是简单、实用。thinker是Python语言的标准库之一,Python自带的IDLE就是用它开发的。用thinker开发的图形界面,显示风格是本地化的。
thinker适用于小型图形界面应用程序的快速开发。
tkinter由若干模块组成,例如tkinter、tkinter和tkinter.constants等。
_tkinter 是二进制扩展模块,提供了对Tk的低级接口,应用级程序员不会直接使用。_tkinter通常是一个共享库(或DLL),但是在一些情况下也可以被Python解释器静态链接。
tkinter是主要使用的模块,在导入tkinter 时会自动导入tkinter. constants。tkinter.constants模块定义了许多常量。
(1)通过类Tk的无参构造函数创建应用程序主窗口
from tkinter import * #导入tkinter模块的所有内容
root = Tk() #创建一个Tk根窗口组件root
(2)在应用程序主窗口中添加各种可视化组件,例如文本框()、按钮()等。通过对应组件类的构造函数可以创建其实例并设置其属性。例如:
btnSayHi = Button(root) #创建一个按钮组件btnSayHi,作为root的子组件
btnSayHi["text"] = "Hello" #设置btnSayHi的text属性
(3)调用组件的pack()/grid()/place()方法,通过几何布局管理器调整其显示位置和大小。例如:
btnSayHi.pack() #调用组件的pack()方法,调整其显示位置和大小
(4)通过绑定事件处理程序响应用户操作引发的事件。例如:
def sayHi(e): #定义事件处理程序
messagebox.showinfo("Message","Hello,world!") #弹出消息框btnSayHi.bind("
",sayHi) #绑定事件处理程序 root.mainloop() #调用组件的mainloop()方法,进入事件循环
例:创建一个简单的图形用户界面
from tkinter import *
from tkinter import messagebox
root = Tk()
btnSayHi = Button(root)
btnSayHi["text"] = "hello"
btnSayHi.pack()
def sayHi(e):
messagebox.showinfo("Message","Hello,world!")
btnSayHi.bind("",sayHi)
root.mainloop()
框架(Frame)是tkinter组件之一,表示屏幕上的一块矩形区域。框架一般作为容器使用,在框架中可以包含其他组件,从而实现复杂界面的布局窗体。
在开放正规和复杂的GUI应用程序时,一般创建一个继承于Frame的类Application,在其构造函数中调用创建其子组件的方法createWidgets()。
通过创建Application的对象实例可以运行GUI应用程序。
创建GUI应用程序类:利用框架创建GUI应用程序,在应用程序窗口中分别设计并实现按钮响应功能。
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self,master = None):
Frame.__init__(self,master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.btnSayHi = Button(self,text="Hello",command=self.sayHi)
self.btnSayHi.pack()
self.btnQuit = Button(self,text="Quit",command=root.destroy)
self.btnQuit.pack()
def sayHi(self):
messagebox.showinfo("Message","Hello,world!")
root = Tk()
app=Application(master=root)
app.mainloop()
1.主窗口属性
通过类Tk的无参构造函数可以创建应用程序主窗口。通过其对象方法title()可以设置窗口标题;通过字典键可以设置其他属性。通过如下命令可以列举字典键:
例如:
root = Tk()root.title('示例') #设置窗口标题
root['width'] = 300; root['height'] = 50 #设置窗口宽度和高度
2.主窗口大小和位置
通过geometry()函数可以设置主窗口的大小和位置,例如:
root.geometry('200x50 - 0 + 0') #窗口大小为200x50,位于屏幕右上角
其中,参数的形式为'wxh(+或-)x(+或-)y'。w为宽度;h为高度;+x为主窗口左边离屏幕左边的距离,-x为主窗口右边离屏幕右边的距离;+y为主窗口上边离屏幕上边的距离,-y为主窗口下边离屏幕下边的距离。
tkinter几何布局管理器用于组织和管理父组件中子配件的布局方式。tkinter提供了3种不同的几何布局管理类,即pack、grid和place。
pack几何布局管理器采用块的方式组织组件。pack根据组件创建生成的顺序将子组件添加到父组件中,通过设置选项可以控制子组件的位置等。采用pack的代码量最少,故它在快速生成界面设计中被广泛采用。
调用子组件的方法pack(),则该子组件在其父组件中采用pack布局。
pack(option = value, … )
pack()方法提供了些选项
选项 | 意义 | 取值范围及说明 |
side | 停靠在父组件的哪一边上 | 'top'、'bottom'、'left'、'right' |
anchor | 停靠的对齐方式。对应于东、南、西、北、中及四个角 | 'n'、's'、'w'、'e'、'nw'、'sw'、 'se'、'ne'、'center' |
fill | 填充空间 | 'x'、'y'、'both'、'none' |
expand | 扩展空间 | 0或1 |
ipadx,ipady | 组件内部在x/y方向上填充的空间大小 | 单位为c(厘米)、m(毫米)、i(英寸)、p(打印机的点) |
padx,pady | 组件外部在x/y方向上填充的空间大小 | 同上 |
例:pack几何布局示例
from tkinter import *
from tkinter import messagebox
def sayhi():
messagebox.showinfo("message","登陆成功!")
root = Tk();root.title("登录")
f1=Frame(root);f1.pack()
f2=Frame(root);f2.pack()
f3=Frame(root);f3.pack()
Label(f1,text="用户名").pack(side=LEFT)
Entry(f1).pack(side=LEFT)
Label(f2,text="密码").pack(side=LEFT)
Entry(f2,show="*").pack(side=LEFT)
Button(f3,text="登录",command=sayhi).pack(side=LEFT)
Button(f3,text="取消",command=root.destroy).pack(side=RIGHT)
root.mainloop()
grid几何布局管理器采用表格结构组织组件。子组件的位置由行/列确定的单元格决定,子组件可以跨越多行/列。在每一列中,列宽由这一列中最宽的单元格确定。grid适合于表格形式的布局,可以实现复杂的界面,因此被广泛采用。
调用子组件的方法grid(),则该子组件在其父组件中采用grid布局。
grid(option = value, ...)
grid()方法提供的选项
选项 | 意义 | 取值范围及说明 |
column | 单元格列号 | 从0开始的正整数 |
columnspan | 列跨度 | 正整数 |
row | 单元格行号 | 从0开始的正整数 |
rowspan | 行跨度 | 正整数 |
ipndx, ipady | 组件内部在x/y方向上填充的空间大小 | 单位为 c(厘米)、m(毫米)、i(英寸)、p(打印机的点)间大小 |
pandx, pady | 组件外部在x/y方向上填充的空间大小 | 同上 |
sticky | 组件紧贴所在单元格的某一边角,对应于东、南、西、北、中以及4个角 | 'n'、's'、'w','e'、'nw'、'sw'、'se'、'ne'、center'。注意:可以紧贴多个边角。例如tk.N + tk.S |
例:grid几何布局示例
from tkinter import *
from tkinter import messagebox
def sayhi():
messagebox.showinfo("message","登陆成功!")
root = Tk();root.title("登录")
Label(root,text="用户名").grid(row=0,column=0)
Entry(root).grid(row=0,column=1,columnspan=2)
Label(root,text="密码").grid(row=1,column=0)
Entry(root,show="*").grid(row=1,column=1,columnspan=2)
Button(root,text="登录",command=sayhi).grid(row=3,column=1,sticky=E)
Button(root,text="取消",command=root.destroy).grid(row=3,column=2,sticky=W)
root.mainloop()
place几何布局管理器允许指定组件的大小与位置。place的优点是可以精确地控制组件的位置,不足之处是改变窗口大小时子组件不能随之灵活地改变大小。
调用子组件的方法place(),则该子组件在其父组件中采用place布局。
place(option, …)
place()方法提供的选项
选项 | 意义 | 取值范围及说明 |
x, y | 绝对坐标 | 从0开始的正整数 |
relx, rely | 相对坐标 | 正整数 |
width, height | 宽和高的绝对值 | |
relwidth, relheight | 宽和高的相对值 | |
anchor | 对齐方式,对应于东、南、西、北、中以及4个角 | 'n'、's'、'w'、'e'、'nw'、 'sw'、'se'、'ne'、' center' |
例:place几何布局示例
from tkinter import *
from tkinter import messagebox
def sayhi():
messagebox.showinfo("message","登陆成功!")
root = Tk();root.title("登录")
root['width']=200; root['height']=80
Label(root,text="用户名",width=6).place(x=1,y=1)
Entry(root,width=20).place(x=45,y=1)
Label(root,text="密码",width=6).place(x=1,y=20)
Entry(root,width=20,show="*").place(x=45,y=20)
Button(root,text="登录",width=8,command=sayhi).place(x=40,y=40)
Button(root,text="取消",width=8,command=root.destroy).place(x=110,y=40)
root.mainloop()
用户通过鼠标和键盘与图形用户界面交互时会触发事件。tkinter事件采用放置于尖括号(<>)内的字符串表示,称之为事件系列(Event sequences).其通用格式如下:
<[modifier - ]…type[ - detail]>
其中,可选的modifier用于组合键定义,例如同时按下Ctrl键; type表示通用类型,例如键盘按键(KeyPress);可选的detail用于具体信息,例如按键A。
常用的事件类型如下:
< Control - Shift - AIt - KeyPress - A> #同时按下Ctrl、Shift、Alt和A几个键
< KeyPress - A> #按下键盘上的A键
< Button - 1 > #单击鼠标左键
< Double - Button - 1 > #双击鼠标左键
另外,也可以使用短格式表示事件,例如'< 1 >'等同于'< Button - 1 >','x'等同于'< KeyPress - x >'。
1.在创建组件对象实例时指定
在创建组件对象实例时,可以通过其命名参数command指定事件处理函数。
2.实例绑定
调用组件对象实例方法bind(),可以为指定组件实例绑定事件,方法如下:
w.bind("< event >", eventhandler, add = ' ')
其中,< event >为事件; eventhandler 为事件处理函数;可选参数add默认为' ',表示事件处理函数代替其他绑定,如果为' 十 ',则加入事件处理队列。
例如绑定组件对象,使得Cnvns组件实例canvasl可以处理鼠标左键事件,代码如下:
canvas1= Canvas();canvas1.bind("< Button - 1 >",drawline)
3.类绑定
调用组件对象实例方法bind, cas(),可以为特定组件类绑定事件:
w. bind_class("Widget", "< event >", eventhandler, add = ' ')
其中,Widget为组件类;
例如绑定组件类,使得所有Canvas组件实例都可以处理鼠标左键事件:
canvas1 = Canvas(); canvas1.bind_class("Canvas", "< Butten - 1 >", drawline)
4.程序界而绑定
调用组件对象实例方法 bind_all(),可以为所有组件类绑定事件:
w.bind_all("< event >", eventhandler, add= ' ')
其中,< event >为事件: eventhandler为事件处理函数。
例如将PrintScreen键与程序中的所有组件对象绑定,使得整个程序界面都能处理打印屏幕的键盘事件:
canvas1=Canvas(); canvas1.bind_all("< Key-Print >", printscreen)
1.定义事件函数和事件方法
事件处理可以定义为函数,也可以定义为对象的方法,两者都带一个参数event.在触发事件调用事件处理函数时将传递Event对象实例。
def handlerNone(ovent):
函数体
def handlerNase(self, event):
方法体
2. Event 事件对象参数属性
通过传递的Event事件对象的属性可以获取各种相关参数
from tkinter import *
root=Tk();root.title("事件处理")
def printEvent(event):
print('当前坐标位置:',event.x,event.y)
root.bind('',printEvent)
root.mainloop()
1.Label
Label(标签)主要用于显示文本信息。Label既可以显示文本,也可以显示图像。
2.LabelFrame
LabelFrame(标签框架)是一个带标签的矩形框架,主要用于包含若干组件。
3.Button
Button用于执行用户的单击操作。如果焦点位于某个Button,则使用鼠标或空格键单击该按钮时会产生command事件。
4.Message
Message(消息)和Label一样,也是用来显示文本信息,但主要用来显示多行文本信息。
5.Entry
Entry(单行文本框)主要用于显示和编辑文本。
6.Text
Text(多行文本框)主要用于显示和编辑多行文本。
7.Radiobutton
Radiobutton(单选按钮)控件用于选择同一组单选按钮中的一个单选按钮。Radiobutton可以显示文本,也可以显示图像。
8.Checkbutton
Checkbutton(复选框)控件用于选择一个或多个选项。Checkbutton可显示文本,也可显示图像。
9.Listbox
Listbox(列表框)用于显示对象列表,并且允许用户选择一项或多项。
10.OptionMenu
OptionMenu(选择项)是允许用户选择一项的列表框(在用户请求时显示)。用户单击下拉按钮可以显示列表框,选择的内容会显示在顶部文本框中。
11.Scale
Scale(移动滑块)控件用于在有界区间内通过移动滑块来选择值。
12.Toplevel
Toplevel(顶层窗口)是直接由窗口管理器管理的窗口,顶层窗口独立于其他窗口,可以创建任意数量的顶层窗口。