提供一个快速和容易的方法来创建GUI应用程序
可以方便地进行图界面设计和交互操作编程
优点:简单易用
与Python结合度好
缺点:缺少合适的可视化界面设计工具
需要通过代码完成窗口设计和元素布局
Python标准安装程序中自带Tkinter模块
常用方法:minloop()主事件循环执行
执行步骤:导入tkinter模块
from tkinter import
或 import tkinter
创建GUI应用程序的主窗口
tk = Tkinter.Tk()
添加各种组件
进入主事件循环的由用户触发每个时间相应
Canvas 画布 提供绘图功能,可以包含图形或位置,实际定制窗口组件
Button 按钮 具有鼠标掠过,按下,释放及键盘操作事件
Label 标签 显示文字或图片
Entry 文本框 单行文字域,收集键盘输入
Text 文本域 多行文字区域,收集或显示用户输入的文字
CheckButton 多选框 一组方框,可以选择多项
Radiobutton 单选框 一组按钮,只可选择一项
Menu 菜单 点击菜单弹出一个选项列表供用户选择
Menubutton 菜单按钮 包含下拉式,层叠式组件
Listox 列表框 一个选项列表,用户可从中选择
Scale 进度条 可设定起始值和结束值,能显示当前位置的精准值
Scrollbar 滚动条 对其支持的组件(画布,文本框,文本域,列表框)提供滚动功能
Frame 框架 包含其他组件的纯容器
Toplevel 顶级容器 类似框架,但提供一个独立的窗口容器
每个组件都有自己的属性和方法
共用的属性:Dimensions: 各种长度,宽度
Color: 颜色
Fonts: 字体
Anchors: 定义文本的相对位置
Relief shyles: 组件的样式
Bitmaps: 位图
Cursors: 光标
布局管理器
pack(): 将组件包装到一个父组件中,创建一个版面
grid(): 通过二维网络组织窗口组件创建一个类似表的版面
place(): 显示将一个窗口组件放到指定的位置
创建画布:canvas = Canvas(master,options=value,....)
参数master: 代表父窗口
options: 设置画布的属性
Canvas 组件
常用属性
bd 边框宽度,以像素为单位,默认为2
bg 背景颜色
confine 默认值中光标形状,arrow,circle,dot
height 高度
width 宽度
常用方法
create_arc() 创建弧线,可以是一个和弦,饼图扇区,或一个简单的弧
create_image() 创建一个图像,可以是位图图像,或照片图像类的一个实例
create_line() 创建一条直线
create_oval() 在给定的坐标绘制一个圆或椭圆
create_polygon() 绘制一个多边形,至少有三个顶点
create_rectangle() 绘制一个矩形
from tkinter import *
import time
# 在画布上绘制正方形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_rectangle(10,10,50,50)
tk.mainloop()
# 在画布上绘制背景为橙色的长方形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
p1 = 10,50
p2 = 300,100
canvas.create_rectangle(p1,p2,fill="orange")
tk.mainloop()
# 在画布上绘制三角形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
p1 = 10,50
p2 = 100,50
p3 = 10,100
canvas.create_polygon(p1,p2,p3,fill="yellow",outline="black")
tk.mainloop()
# 在画布上绘制多边形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
p1 = 200,110
p2 = 240,130
p3 = 120,200
p4 = 140,220
canvas.create_polygon(p1,p2,p3,p4,fill="green",outline="blue")
tk.mainloop()
# 在画布上显示文字
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_text(100.10,text="你好吗?",font=("宋体"))
tk.mainloop()
# 在画布上绘制各种形状的图形
tk = Tk()
canvas = Canvas(tk,width=400,height=500,bg="grey",bd=0)
canvas.pack()
coord1 = 10,10,200,80
coord2 = 10,80,200,160
coord3 = 10,160,200,240
coord4 = 10,240,200,320
coord5 = 10,320,200,400
canvas.create_arc(coord1,start=0,extent=45,style=ARC)
canvas.create_arc(coord2,start=0,extent=90,style=ARC)
canvas.create_arc(coord3,start=0,extent=180,style=ARC)
canvas.create_arc(coord4,start=0,extent=350,style=ARC)
canvas.create_arc(coord5,start=0,extent=150,fill="blue")
tk.mainloop()
#水平方向移动三角形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
point1 = 10,10
point2 = 10,60
point3 = 50,35
canvas.create_polygon(point1,point2,point3)
for i in range(0,60):
canvas.move(1,5,0)
tk.update()
time.sleep()
tk.mainloop()
事件(Event)
是对象对外部动作的响应
如:手机铃声响了,有人敲门了
计算机软件范畴中,事件由系统事件设定的,能被对象设别和响应的动作
事件是GUI应用程序的组成部分
如:用户敲击键盘上的某个键,或点击移动鼠标
事件驱动
事件是对象发送的消息,发信息通知操作的发生
引发事件的对象称为事件发送方
捕获事件并作出响应的对象叫做事件接收方
事件发生后,需要对其作出反应和处理
事件处理方会根据事件信息对事件进行处理
例如:在用户敲击键盘上的某个键,或点击移动鼠标后系统会执行相应的操作,打开窗口,保存文件等等
所有GUI应用程序都是事件驱动
事件处理
事件是GUI程序的组成部分
GUI程序中,每个组成都是一个对象
组件的组成
属性:容纳程序里要用到的数据
方法:执行的操作
事件:一种信息通知
不同的徐建对象具有不同的事件
例如:用户敲击键盘上的某个键,或点击移动鼠标
当事件发生时,会调用某个对应的方法处理该事件
绑定
为程序建立一个处理某个事件的事件处理方法
级别
实例绑定:将事件与一个特定组件实例绑定
组件实例,bind(事件描述符,事件处理方法)
类绑定:将事件与一个组件类绑定
组件实例,bind_class(组件类,事件描述符,事件处理方法)
程序界面绑定:当界面上任何组件实例触发某个事件,程序都作出相应的处理
widget.bind_all(事件描述符,事件处理方法)
如:按下鼠标左键与Canvas对象绑定画一条线
canvas.bind("<Button-1>",drawline)
如;绑定按钮类,所有按钮对象可处理鼠标左键操作事件
widget.bind_class("Canvas","<Button-1>",drawline)
如:将PrintScreen键与程序所有组件对象绑定
widget.bind_all("<Key-Print>",printScreen)
事件队列与事件类型
事件队列:包含一个或多个事件类型的字符串
每个事件类型指定了一项事件
当有多项事件类型包含于事件队列中,当且仅当描述符中全部事件发生时才能调用处理方法
事件类型的通用处理格式
<[modifier]...type[-detail]>
事件类型必须放置于尖括号“<>”内
modifier用于组合键定义,如Control,Alt
type描述了通用类型
detail用于明确定以是哪一个键或按钮的事件
<KeyPreess-A>表示按下键盘A键
<Buttin-1>表示按下鼠标左键
键盘事件
事件名称
KeyPress 按下键盘某键时触发,可以在detail部分指定是哪个键
KeyRelease 释放键盘某键时触发,可以在detail部分指定是那个键
鼠标事件
ButtonPress 按下鼠标某键,可以在detail部分指定是哪个键
ButtonRelease 释放鼠标某键,可以在detail部分指定的那个键
Motion 点中组件的同时拖拽组件移动时触发
Enter 当鼠标指针移进某组件触发
Leave 当鼠标指针移出某组件触发
MouseWheel 当鼠标滚轮滚动式触发
窗体事件
Visibility 当组件变为可视态时触发
Unmap 当组件由显示状态变为隐藏状态时触发
Map 当组件由隐藏状态变为显示状态时触发
Expose 当组件从原本被其他组件遮盖的状态中暴露出来时触发
FocusIn 组件获得焦点时触发
FocusOut 组件失去焦点时触发
Activate 与组件选项中state项有关,表示组件由不可用转为可用
Deactivate 与组件选项中state项有关,表示组件由可用转为不可用
事件前缀
Alt 按下Alt键时
Any 按下如何按键时
Control 按下Control键时
Double 两个事件在短时间内发生时
Lock 按下Caps lock 键时
Shift 按下Shift键时
Triple 类似于Double,三个事件在短时间内发生
事件(Event)
是对象对外部动作的响应
如:手机铃声响了,有人敲门了
计算机软件范畴中,事件由系统事件设定的,能被对象设别和响应的动作
事件是GUI应用程序的组成部分
如:用户敲击键盘上的某个键,或点击移动鼠标
事件驱动
事件是对象发送的消息,发信息通知操作的发生
引发事件的对象称为事件发送方
捕获事件并作出响应的对象叫做事件接收方
事件发生后,需要对其作出反应和处理
事件处理方会根据事件信息对事件进行处理
例如:在用户敲击键盘上的某个键,或点击移动鼠标后系统会执行相应的操作,打开窗口,保存文件等等
所有GUI应用程序都是事件驱动
事件处理
事件是GUI程序的组成部分
GUI程序中,每个组成都是一个对象
组件的组成
属性:容纳程序里要用到的数据
方法:执行的操作
事件:一种信息通知
不同的徐建对象具有不同的事件
例如:用户敲击键盘上的某个键,或点击移动鼠标
当事件发生时,会调用某个对应的方法处理该事件
绑定
为程序建立一个处理某个事件的事件处理方法
级别
实例绑定:将事件与一个特定组件实例绑定
组件实例,bind(事件描述符,事件处理方法)
类绑定:将事件与一个组件类绑定
组件实例,bind_class(组件类,事件描述符,事件处理方法)
程序界面绑定:当界面上任何组件实例触发某个事件,程序都作出相应的处理
widget.bind_all(事件描述符,事件处理方法)
如:按下鼠标左键与Canvas对象绑定画一条线
canvas.bind("<Button-1>",drawline)
如;绑定按钮类,所有按钮对象可处理鼠标左键操作事件
widget.bind_class("Canvas","<Button-1>",drawline)
如:将PrintScreen键与程序所有组件对象绑定
widget.bind_all("<Key-Print>",printScreen)
事件队列与事件类型
事件队列:包含一个或多个事件类型的字符串
每个事件类型指定了一项事件
当有多项事件类型包含于事件队列中,当且仅当描述符中全部事件发生时才能调用处理方法
事件类型的通用处理格式
<[modifier]...type[-detail]>
事件类型必须放置于尖括号“<>”内
modifier用于组合键定义,如Control,Alt
type描述了通用类型
detail用于明确定以是哪一个键或按钮的事件
<KeyPreess-A>表示按下键盘A键
<Buttin-1>表示按下鼠标左键
键盘事件
事件名称
KeyPress 按下键盘某键时触发,可以在detail部分指定是哪个键
KeyRelease 释放键盘某键时触发,可以在detail部分指定是那个键
鼠标事件
ButtonPress 按下鼠标某键,可以在detail部分指定是哪个键
ButtonRelease 释放鼠标某键,可以在detail部分指定的那个键
Motion 点中组件的同时拖拽组件移动时触发
Enter 当鼠标指针移进某组件触发
Leave 当鼠标指针移出某组件触发
MouseWheel 当鼠标滚轮滚动式触发
窗体事件
Visibility 当组件变为可视态时触发
Unmap 当组件由显示状态变为隐藏状态时触发
Map 当组件由隐藏状态变为显示状态时触发
Expose 当组件从原本被其他组件遮盖的状态中暴露出来时触发
FocusIn 组件获得焦点时触发
FocusOut 组件失去焦点时触发
Activate 与组件选项中state项有关,表示组件由不可用转为可用
Deactivate 与组件选项中state项有关,表示组件由可用转为不可用
事件前缀
Alt 按下Alt键时
Any 按下如何按键时
Control 按下Control键时
Double 两个事件在短时间内发生时
Lock 按下Caps lock 键时
Shift 按下Shift键时
Triple 类似于Double,三个事件在短时间内发生
#水平方向移动三角形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
point1 = 10,10
point2 = 10,60
point3 = 50,35
canvas.create_polygon(point1,point2,point3)
for i in range(0,60):
canvas.move(1,5,0)
tk.update()
time.sleep(0.02)
tk.mainloop()'''
# 按下键盘的return键水平移动三角形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
canvas.create_polygon(10,10,10,60,50,35)
def movetriangle(event):
canvas.move(1,5,0)
canvas.bind_all("<KeyPress-Return>",movetriangle)
tk.mainloop()
# 使用键盘的上下左右键移动三角形
tk = Tk()
canvas = Canvas(tk,width=400,height=400)
canvas.pack()
id1 = canvas.create_polygon(10,10,10,60,50,35)
def movetriangle(event):
if event.keysym == "Up":
canvas.move(id1,0,-3)
elif event.keysym == "Down":
canvas.move(id1,0,3)
elif event.keysym == "Left":
canvas.move(id1,-3,0)
else:
canvas.move(id1,3,0)
canvas.bind_all("<KeyPress-Up>",movetriangle)
canvas.bind_all("<KeyPress-Down>",movetriangle)
canvas.bind_all("<KeyPress-Left>",movetriangle)
canvas.bind_all("<KeyPress-Right>",movetriangle)
tk.mainloop()