开发GUI的工具包 

 提供一个快速和容易的方法来创建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()