一、介绍

tkinter模块是Python标砖的Tk GUI工具包的接口,无须安装任何包就可以直接使用。
tkinter可以在大多数的unix平台下使用,同样可以应用于windows、Linux和Macintsh等多种操作系统平台。
注意:千万别把Python的GUI程序命名成tkinter,或者把什么其他的程序命名成tkinter,只要命名成这个,一调用就会报这个错。AttributeError: module ‘tkinter’ has no attribute ‘Tk’

二、使用步骤

2.1 导入tkinter模块

import tkinter 或 from tkinter import *

2.2 创建主程序的顶层主窗口对象

主窗口对象top(名字任意),用于容纳程序所有可能的组件(widget)。
tktiner.TK() 返回的窗口时顶层窗口,一般命名为root或top。顶层窗口只能创建一次,并且在其他窗口创建之前被创建。

2.3 在主窗口中创建其他组件

在主窗口中创建其他组件,eg:标签(Label)、按钮(Button)、输入框(Entty)、框架(Frame)、菜单(Menu)、滚动条(Scrollbar)等。
组件既可以时独立的,也可以作为容器存在,作为容器的时候,它就是容器中组件的父组件。

2.4 将GUI模块与底层代码进行连接

将组件在窗口中显示并实现布局,有pack() 、grid() 、place() 布局方法。

2.5 进入主事件循环,响应由用户触发每个事件

组件会有一定行为和动作,eg:按钮被按下、进度条被拖动、文本框被写入等,这些用户行为被称为事件,针对事件的响应动作称为回调函数(callback)。
用户操作、产生事件,然后响应callback执行,整个过程称为事件驱动。
只有窗口内的对象处于循环等待状态,才能由某个事件引发窗口内的对象完成某种功能

  1. import tkinter
  2. # from tkinter import*
  3. top = tkinter.Tk()
  4. label = tkinter.Label(top,text='hello world')
  5. label.pack() ##使用简单布局显示
  6. top.mainloop() ##进入事件循环
  7. ##TK是模块tkinter的类,top是TK的实例

image.png

三、公共属性

3.1 ancher

定义控件在窗口内的位置或文件信息在控件内的位置。
N、NE、E、SE、S、SW、W、NW或CENTER

3.2 background(bg)

定义控件的背景颜色,可以使用表中的颜色,也可以使用”#rrggbb” 形式的数字
image.png

  1. from tkinter import*
  2. win = Tk()
  3. win.title(string ='古诗鉴赏')
  4. Label(win,background="SystemHighlight", text="柳带摇风汉水滨,平芜两岸争匀").pack()
  5. Label(win,background="#00ff00", text="鸳鸯对浴浪痕新").pack()
  6. win.mainloop()

image.png

3.3 bitmap

定义显示在控件内的bitmap图片文件

3.4 borderwidth

定义控件的边框宽度,单位为像素

  1. from tkinter import *
  2. win = Tk()
  3. ##定义一个边框宽度为13像素的按钮
  4. Button(win,relief= RIDGE,borderwidth=13,text="关闭",command=win.quit).pack()
  5. win.mainloop()

image.png

3.5 command

定义动作发生时候使用的Python函数

  1. from tkinter import *
  2. win = Tk()
  3. win.title(string="关闭程序")
  4. Button(win,text="关闭",command=win.quit).pack()
  5. win.mainloop()

image.png

3.6 cursor

定义当鼠标指针移动到控件上的时候,鼠标指针的类型。
cross(十字)、arrow(箭头)、watch(转圈圈)、xterm(竖杠)、fleur(上下左右箭头)

  1. from tkinter import *
  2. win = Tk()
  3. Button(win,background='#FFE4B5', cursor='cross',text="关闭",command=win.quit).pack()
  4. Button(win,background='#FFE4E1',cursor='arrow',text="关闭",command=win.quit).pack()
  5. Button(win,background='#FFDAB9',cursor='watch',text="关闭",command=win.quit).pack()
  6. Button(win,background='#90EE90',cursor='xterm',text="关闭",command=win.quit).pack()
  7. Button(win,background='#E0FFFF',cursor='fleur',text="关闭",command=win.quit).pack()
  8. win.mainloop()

image.png

3.7 font

如果控件支持标题文字,定义标题文字的字体格式。
是一个元组格式(字体、大小、字体样式)。
字体样式可以是bold(加粗)、italic(斜体)、underline(下划线)、overstrike(划掉)

  1. from tkinter import *
  2. win = Tk()
  3. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="独绕虚亭步石矼,静中情味世无双。").pack()
  4. Label(win,background='#FFE4E1',font=("Symbol",35,"bold overstrike"),text="山蝉带响穿疏户,野蔓盘青入破窗。").pack()
  5. Label(win,background='#90EE90',font=("宋体",40,"bold italic"),text="二子逢时犹死饿,三闾遭逐便沉江。").pack()
  6. Label(win,background='#90EE90',font=("Times",40,"bold italic underline"),text="My bucket list").pack()
  7. win.mainloop()

image.png

3.8 foreground(fg)

定义控件的前景(文字)颜色,颜色值可以是background那边那个表中的名称,也可以是rgb色的形式。

  1. from tkinter import *
  2. win = Tk()
  3. Label(win,background='#FFE4E1',font=("Symbol",35,"bold "),text="长安寒食",foreground="#1C1C1C").pack()
  4. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="春日照九衢。春风媚罗绮。",foreground="#8B4726").pack()
  5. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="万骑出都门,拥在香尘里。",foreground="#8B4726").pack()
  6. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="莫辞吊枯骨,千载长如此。",foreground="#8B4726").pack()
  7. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="安知今日身,不是昔时鬼。",foreground="#8B4726").pack()
  8. Label(win,background='#FFE4B5',font=("Times",30,"bold"),text="但看平地游,亦见摧辀死。",foreground="#8B4726").pack()
  9. win.mainloop()

image.png

3.9 height

如果是Button、Label或Text控件,这个属性定义以字符数目为单位的高度。其他控件则是定义以像素pixel为单位的高度。

  1. from tkinter import *
  2. win =Tk()
  3. Button(win,background='#FFE4B5',height=5,text="关闭",command=win.quit).pack()
  4. win.mainloop()

image.png

3.10 highlightbackground

定义控件在没有键盘焦点的时候,画highlight区域的颜色

3.11 highlightcolor

定义控件在有键盘焦点的时候,画highlight区域的颜色

3.12 highlightthickness

定义hightlight区域的宽度,以像素为单位

3.13 width

如果是Button、Label或Text控件,这个属性定义以字符数目为单位的高度。其他控件则是定义以像素pixel为单位的高度。

  1. from tkinter import *
  2. win =Tk()
  3. Button(win,background='#FFE4B5',width=20,text="关闭",command=win.quit).pack()
  4. win.mainloop()

image.png

3.14 image

定义显示在控件中的图片文件。

3.15 justify

定义多行文本标题的排列方式,left, right, or center。

3.16 padx,pady

定义控件内的文本或图片与控件边框之间的水平和垂直距离。

  1. from tkinter import *
  2. win = Tk()
  3. Button(win,background='#FFE4B5',width=20,text="关闭",command=win.quit,padx =20,pady =40).pack()
  4. win.mainloop()

image.png

3.17 relief

定义组件的边框形式,所有组件都是有边框的,不过有些组件的边框不可见。
3D形式的边框,属性可以是SUNKEN(下凹的)、RIDGE(山脊)、RAISED(凸起)或GROOVE(凹槽)
2D形式的边框,属性可以是FLAT(扁平)或SOLID(加粗)

  1. from tkinter import *
  2. win = Tk()
  3. Button(win,background="#98FB98",relief=FLAT,text="关闭",command=win.quit).pack()
  4. Button(win,background="#98FB98",relief=SOLID,text="关闭",command=win.quit).pack()
  5. win.mainloop()

image.png

3.18 text

定义控件的标题文字

3.19 variable

将控件的数值映射到一个变量。当控件的数值改变的时候,这个变量也会跟着改变。同样,变量改变的时候,控件的数值也会跟着改变。
StringVar类、IntVar类、DoubleVar类和BooleanVar的实例变量,这些实例变量可以使用get() 和set() 方法读取与设置变量。

四、组件布局

4.1 pack()

将控件放置在父控件内之前,规划此控件在区块内的位置。
pack() 方法按照其内的属性设置,将控件放置在Frame控件(窗体)或窗口内。当用户创建一个Frame控件后,就可以将控件放入。Frame控件内存储控件的位置叫做parcel。
如果相将一组控件按照顺序放入,将这些控件的anchor的属性设为相同的。如果没有设置任何选项,这些控件就会从上而下排列。
语法格式:<>.pack([参数列表], ……)

参数 说明 取值范围
side 指定组件停靠在父组件的哪一个方向上 top(默认值);bottom;left;right
fill 指定水平(x)或垂直(y)方向填充
当属性side=”top” 或”bottom”时,填充x方向
当属性side=”left “或”right”时,填充y方向
x;y;both;none
expend 当值为yes的时候,side选项无效,组件显示在父组件中心位值,如果fill选项位both的时候,则填充父组件的剩余空间
为0的时候,不占满,为1的时候,占满
yes;no;自然数;0
anchor 指定对齐方式
左对齐“w”、右对齐“e”、顶对齐“n”、底对齐“s”
n;s;w;e;nw;sw;se;ne;center(默
认值)
ipadx, ipady 与fill共同使用,组件内部在x(y)方向上填充的空间大小
默认单位说像素,可选单位c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸)
非负浮点数(默认值为0.0)
padx,pady 与fill共同使用,组件外部在x(y)方向上填充的空间大小
默认单位说像素,可选单位c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸)
非负浮点数(默认值为0.0)
bofore 先创建这个组件再创建选定组件 已经pack后的组件对象
after 先创建选定组件再创建本组件 已经pack后的组件对象
in 指定本组件的master为选定组件 已经pack后的组件对象
  1. from tkinter import *
  2. ##主窗体
  3. win = Tk()
  4. ##第一个窗体
  5. frame1 = Frame(win,relief=RAISED,borderwidth=5) ##窗体的边框样式为凸起,边框厚度为5
  6. frame1.pack(side=TOP,fill=BOTH,ipadx=13,ipady=13,expand=0) ##窗体在窗口的顶端,fill=BOTH,窗体占满整个窗口的剩余空间
  7. Button(frame1,text="按钮1",background="#98FB98").pack(side=LEFT,padx=13,pady=13) ##按钮从左开始排列,控件之间的水平距离和垂直距离都是13像素
  8. Button(frame1,text="按钮2",background="#97FFFF").pack(side=LEFT,padx=13,pady=13)
  9. Button(frame1,text="按钮3",background="#7FFFD4").pack(side=LEFT,padx=13,pady=13)
  10. ##第二个窗体
  11. frame2 = Frame(win,relief=GROOVE,borderwidth=5) ##窗体的边框样式为内陷,边框厚度为5
  12. frame2.pack(side=BOTTOM,fill=None,ipadx="1c",ipady="1c",expand=1) ##窗体在窗口的底端,fill=None,当窗口改变的时候,窗体不会占满整个窗口的剩余空间,控件和窗体边界的水平和垂直距离都是1cm
  13. Button(frame2,text="按钮4",background="#98FB98").pack(side=RIGHT,padx="1c",pady="1c") ##按钮从右开始排列,控件之间的水平距离和垂直距离都是1cm
  14. Button(frame2,text="按钮5",background="#97FFFF").pack(side=RIGHT,padx="1c",pady="1c")
  15. Button(frame2,text="按钮6",background="#7FFFD4").pack(side=RIGHT,padx="1c",pady="1c")
  16. ##第三个窗体
  17. frame3 = Frame(win,relief=SUNKEN,borderwidth=5) ##窗体的边框样式为下凹的,边框厚度为5
  18. frame3.pack(side=LEFT,fill=X,ipadx="0.1i",ipady="0.1i",expand=1) #窗体在窗口的左端,fill=X,当窗口改变的时候,窗体会占满整个窗口剩余的水平空间,但是由于expand=1,窗体不会占满整个窗口的剩余空间,所以控件和窗体边界的水平和垂直距离都是0.1英寸
  19. Button(frame3,text="按钮7",background="#98FB98").pack(side=TOP,padx="0.1i",pady="0.1i")##按钮从上向下开始排列,控件之间的水平距离和垂直距离都是1英寸
  20. Button(frame3,text="按钮8",background="#97FFFF").pack(side=TOP,padx="0.1i",pady="0.1i")
  21. Button(frame3,text="按钮9",background="#7FFFD4").pack(side=TOP,padx="0.1i",pady="0.1i")
  22. ##第四个窗体
  23. frame4 = Frame(win,relief=RIDGE,borderwidth=5) ##窗体的边框样式为山脊,边框厚度为5
  24. frame4.pack(side=RIGHT,fill=Y,ipadx="13p",ipady="13p",expand=1)#窗体在窗口的左端,fill=Y,当窗口改变的时候,窗体会占满整个窗口剩余的垂直控件。控件和窗体边界的水平和垂直距离都是13
  25. Button(frame4,text="按钮10",background="#98FB98").pack(side=BOTTOM,padx="13p",pady="13p")##按钮从下向上开始排列,控件之间的水平距离和垂直距离都是13
  26. Button(frame4,text="按钮11",background="#97FFFF").pack(side=BOTTOM,padx="13p",pady="13p")
  27. Button(frame4,text="按钮12",background="#7FFFD4").pack(side=BOTTOM,padx="13p",pady="13p")
  28. ##开始窗口的事件循环
  29. win.mainloop()

image.png
拉伸窗口之后的结果
image.png

4.2 grid()

grid()方法将空间按照表格的行列方式,来放置在窗体或窗口内

选项 说明
row 表格中的第几列
column 表格中的第几栏
columnspan 表格中合并栏的数目
rowspan 表格中合并列的数目
ipadx, ipady 组件内部在x(y)方向上填充的空间大小
默认单位说像素,可选单位c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸)
padx,pady 组件外部在x(y)方向上填充的空间大小
默认单位说像素,可选单位c(厘米)、m(毫米)、i(英寸)、p(打印机的点,即1/27英寸)
in_ 指定本组件的master为选定组件
sticky 组件紧靠所在单元格的某一边
n;s;w;e;nw;sw;se;ne;center(默
认值)
  1. from tkinter import *
  2. ##主窗口
  3. win = Tk()
  4. ##创建窗体
  5. frame = Frame(win,relief=RAISED,borderwidth=5) ##窗体的边框样式为突起,边框厚度为5像素
  6. frame.pack(side=TOP,fill=BOTH,ipadx=5,ipady=5,expand=0) ##TOP,expand为0,窗口变化的时候,会占满整个窗口
  7. ##创建按钮
  8. for i in range(5):
  9. for j in range(5):
  10. Button(frame,text="("+str(i)+"i"+str(j)+")",background="#98FB98").grid(row=i,column=j)
  11. ##开始窗口的事件循环
  12. win.mainloop()

image.png

4.3 place()

palce() 设置控件在窗口或窗体内的绝对地址和相对地址。

选项 说明
anchor 定义控件在窗体或窗口内的方位。
N、W、E、S、SE、SW、NE、NW、CENTER。
默认是NE
bordermode 定义控件的坐标是否要考虑边界的宽度
OUTSIDE或INSIDE,默认是INSIDE
height 定义控件的高度,默认单位为像素
weight 定义控件的宽度,默认单位为像素
in(in_) 定义控件相对于参考控件的位置,如果使用在键值上,必须使用in_
reheight 定义控件相对于参考控件(使用in_选项)的高度
reweight 定义控件相对于参考控件(使用in_选项)的宽度
relx 定义控件相对于参考控件(使用in_选项)的水平位移。如果没有设置,则是相对于父控件
rely 定义控件相对于参考控件(使用in_选项)的垂直位移。如果没有设置,则是相对于父控件
x 定义控件的绝对水平位置,默认值为0
y 定义控件的绝对垂直位置,默认值为0
  1. from tkinter import *
  2. ##主窗体
  3. win =Tk()
  4. ##创建窗体
  5. frame = Frame(win,relief=RAISED,borderwidth=5,width=400,height=300)
  6. frame.pack(side =TOP,fill = BOTH,ipadx=5,ipady=5,expand=1)
  7. ##第一个控件
  8. botton1 = Button(frame,text="按钮1",background="#98FB98")
  9. botton1.place(x =40,y=40,anchor=W,width=80,height=80,)
  10. ##第二个控件
  11. botton1 = Button(frame,text="按钮2",background="#7FFFD4")
  12. botton1.place(x =140,y=240,anchor=N,width=80,height=80)
  13. ##开始窗口的事件循环
  14. win.mainloop()

image.png

五、tkinter的事件

事件处理例程(callback函数)
语法:

  1. def function(event):
  2. ……
  3. widget.bind("<event>" ,function)
  4. widgettkinter控件的实例变量
  5. <event>是事件的名称
  6. function 是事件处理例程。tkinter会传给事件处理例程一个event变量,此变量包含事件发生时候的x,y坐标(鼠标事件)以及

5.1 事件的属性

当有事件发生的时候,tkinter会传给事件处理例程一个event变量,这个变量包含下面的属性

属性名称 说明
char 键盘的字符码,eg:”a”键的chr属性为”a”,”F1”键的caher属性无法显示
keycode 键盘的ASCII码,eg:”a”键的chr属性为65
keysym 键盘的符号,eg:”a”键的chr属性为”a”,”F1”键的caher属性等于”F1”
height,width 控件的新高度与宽度,单位是像素
num 事件发生时的鼠标按键码
widget 事件发生所在的控件实例变量
x,y 目前的鼠标光标位置
x_root,y_root 相对于屏幕左上角的目前鼠标光标位置
type 显示事件的种类

5.2 事件绑定方法

方法 说明
after(milliseconds[,callback [,arguments]]) 在milliseconds事件后,调用callback函数,arguments是callback
函数的参数。
这个方法返回一个identifier的值,可以应用在after_cancle()方法
after_cancel(identifier) 取消callback函数,identifier是after()函数的返回值
after_idle(callback,arguments) 当系统在idle状态(无事可做)的时候,调用callback函数
bindtags() 返回控件所使用的绑定搜索顺序。返回值是一个元组,包含搜索绑定
所用的命名空间
bind(event,callback) 设置event事件的处理函数callback。
可以使用bind(event,callback,”+”)的格式设置多个callback函数
bind_all(event,callback) 设置event事件的处理函数callback。
可以使用bind_all(event,callback,”+”)的格式设置多个callback函数。
可以用于设置公用的快捷键
bind_class(widgetclass,event,callback) 设置event事件的处理函数callback,这个callback函数由widgetclass
类而来。
bind_class(widgetclass,event,callback,”+”)的格式设置多个callback函数。
此实例变量可以用于指示当空间的大小改变,或者移到新的位置
unbind(event) 删除event事件与callback函数的绑定
unbind_all(event) 删除应用程序附属的event事件与callback函数的绑定
unbind_class(event) 删除event事件与callback函数的绑定。此callback函数由widgetclass
类而来。

5.3 鼠标事件

当处理鼠标事件的时候,1代表鼠标左键,2代表鼠标中间键,3代表鼠标右键。

事件 说明
此事件在鼠标指针进入控件的时候发生
此事件在鼠标指针离开控件的时候发生
、或<1> 此事件在控件上鼠标左键时发生。
此事件在控件上鼠标中间键时发生。
此事件在控件上鼠标右键时发生。
此事件在单机鼠标左键,移动控件时发生
此事件在释放鼠标左键时发生
此事件在双击鼠标左键时发生
  1. from tkinter import *
  2. ##处理鼠标光标进入窗体时的事件
  3. def handleEnterEvent(event):
  4. label1["text"] ="你进入了窗口"
  5. label2["text"] =" "
  6. label3["text"] =" "
  7. ##处理鼠标光标离开窗体时的事件
  8. def handleLeaveEvent(event):
  9. label1["text"] ="你离开了窗口"
  10. label2["text"] =""
  11. label3["text"] =""
  12. ##处理在窗体内单击鼠标左键的事件
  13. def handLeftButtonPressEvent(event):
  14. label1["text"] ="你点击了左键"
  15. label2["text"] ="x= "+str(event.x)
  16. label3["text"] ="y= "+str(event.y)
  17. ##处理在窗体内单击鼠标中间键的事件
  18. def handMiddleButtonPressEvent(event):
  19. label1["text"] ="你点击了中间键"
  20. label2["text"] ="x= "+str(event.x)
  21. label3["text"] ="y= "+str(event.y)
  22. ##处理在窗体内单击鼠标右键的事件
  23. def handRightButtonPressEvent(event):
  24. label1["text"] ="你点击了右键"
  25. label2["text"] ="x= "+str(event.x)
  26. label3["text"] ="y= "+str(event.y)
  27. ##处理在窗体内单击鼠标左键,然后移动鼠标光标的事件
  28. def handLeftButtonMoveEvent(event):
  29. label1["text"] ="你单击鼠标左键,并且移动了鼠标光标"
  30. label2["text"] ="x= "+str(event.x)
  31. label3["text"] ="y= "+str(event.y)
  32. ##处理在窗体内放开鼠标左键的事件
  33. def hanleLeftButtonReleaseEvent(event):
  34. label1["text"] ="你放开了鼠标左键"
  35. label2["text"] ="x= "+str(event.x)
  36. label3["text"] ="y= "+str(event.y)
  37. ##处理在窗体内双击鼠标左键的事件
  38. def hanleLeftButtonDoubleClickEvent(event):
  39. label1["text"] ="你双击了鼠标左键"
  40. label2["text"] ="x= "+str(event.x)
  41. label3["text"] ="y= "+str(event.y)
  42. ##创建主窗体
  43. win = Tk()
  44. ##创建窗体
  45. frame =Frame(win,relief=RAISED,borderwidth=5,width=300,height=200)
  46. frame.bind("<Enter>",handleEnterEvent)
  47. frame.bind("<Leave>",handleLeaveEvent)
  48. frame.bind("<Button-1>",handLeftButtonPressEvent)
  49. frame.bind("<ButtonPress-2>",handMiddleButtonPressEvent)
  50. frame.bind("<3>",handRightButtonPressEvent)
  51. frame.bind("<B1-Motion>",handLeftButtonMoveEvent)
  52. frame.bind("<ButtonRelease-1>",hanleLeftButtonReleaseEvent)
  53. frame.bind("<Double-Button-1>",hanleLeftButtonDoubleClickEvent)
  54. ##文件标签,显示鼠标事件的种类
  55. label1 = Label(frame,text="没有事件发生",foreground="#98FB98",background="#FFFFFF")
  56. label1.place(x=16,y=20)
  57. ##文字标签,显示鼠标事件发生时的x坐标
  58. label2 = Label(frame,text="x = ",foreground="#98FB98",background="#FFFFFF")
  59. label2.place(x=16,y=70)
  60. ##文字标签,显示鼠标事件发生时的y坐标
  61. label3 = Label(frame,text="y =",foreground="#98FB98",background="#FFFFFF")
  62. label3.place(x=16,y=120)
  63. ##设置窗体的位置
  64. frame.pack(side =TOP)
  65. ##开始窗口的事件循环
  66. win.mainloop()

image.png image.pngimage.png image.png
image.png image.png

5.4 键盘事件

事件 说明
ASCII码48-90时发生,即数字键、字母键及+ - 等符号
CTRL+UP组合键
其他按键,使用其按键名称
  1. from tkinter import *
  2. ##处理在窗体内按下键盘按键(非功能键)的事件
  3. def handleKeyEvent(event):
  4. label1["text"]="你按下了"+event.keysym + '键\n'
  5. label1["text"] +="keycode"+str(event.keycode) ## 接在label1上一行的后面
  6. ##创建主窗口
  7. win = Tk()
  8. ##创建窗体
  9. frame =Frame(win,relief=RAISED,borderwidth=5,width=300,height=200)
  10. ##将主窗口与键盘事件连接
  11. eventType =["Key","Control-Up","Return","Escape","F1","F2","F3","F4","F5","F6","F7","F8","F9","F11","F12","Num_Lock","Scroll_Lock","Caps_Lock","Print","Insert","Delete","Pause","Prior","Next","BackSpace","Tab","Cancel","Control_L","Alt_L","Shift_L","End","Home","Up","Down","Left","Right"]
  12. for type in eventType:
  13. win.bind("<"+type+">",handleKeyEvent)
  14. ##文字标签,显示键盘事件的种类
  15. label1 = Label(frame,text="没有事件发生",foreground="#1C1C1C",background="#FFFFFF")
  16. label1.place(x=15,y=20)
  17. ##设置窗体的位置
  18. frame.pack(side =TOP)
  19. ##开始窗口的事件循环
  20. win.mainloop()

image.png image.png image.png image.png

5.5 窗体事件

事件 说明
当组件变为可视状态时触发
当组件由显示状态变为隐藏状态时触发
当组件由隐藏状态变为显示状态时触发
当组件由原本被其他组件遮盖的状态中暴露出来时触发
组件获得焦点时触发
组件失去焦点时触发
当组件被销毁时触发

5.6 系统协议

tkinter提供协议处理例程(protocol heandle),拦截系统信息的机制,用户可以拦截这些系统信息,然后设置成字节的处理例程
通常处理的协议:

协议 说明
WM_DELETE_WINDOW 当系统要关闭该窗口时发生
WM_TAKE_FOCUS 当应用程序得到焦点时发生
WM_SAVE_YOUTSELF 当应用程序需要存储内容时发生

语法格式:
widget.protocol(protocol,funnction_handler)
widget必须是一个Toplevel控件。

  1. from tkinter import *
  2. import tkinter.messagebox
  3. ##处理WM_DELETE_WINDOW事件
  4. def handeleProtocol():
  5. #打开一个确定/取消会话框
  6. if tkinter.messagebox.askokcancel("提示","你确定要关闭窗口吗?"):
  7. ##确定要结束应用程序
  8. win.destroy()
  9. ##创建主窗口
  10. win = Tk()
  11. ##创建协议
  12. win.protocol("WM_DELETE_WINDOW",handeleProtocol)
  13. ##开始窗口的的事件循环
  14. win.mainloop()

image.png

六、tkinter控件

tkinter包含15个控件

控件名称 说明
Buttom 按钮控件,在程序中显示一个按钮
Canvas 画布控件,用来画图形,eg:线条即多边形等
Checkbutton 多选框控件,用于在程序中提供多项选择框
Entry 输入控件,定义一个简单的文本输入字段
Frame 框架控件,定义一个窗体,以作为其他控件的容器
Label 标签控件,定义一个文字或图片标签
Listbox 列表框控件,定义一个下拉方块
Menu 菜单控件,定义一个菜单栏、下拉菜单何弹出菜单
Menubuttom 菜单按钮控件,用于显示菜单栏
Message 消息控件,定义一个对话框
Radiobutton 单选按钮控件,定义一个单选按钮
Scale 范围控件,定义一个滑动条,以帮助用户设置数值
Scrollbar 滚动条控件,定义一个滚动条
Text 文本控件,定义一个文本框
Toplevel 与Frame控件类似,可以作为其他控件的容器。
整个控件有字节的最上层窗口,可以提供窗口管理接口

6.1 Button 控件

Button控件用于创建按钮,按钮内可以显示文字或图片

方法名称 说明
flash() 将前景与背景颜色互换,以产生闪烁的效果
invoke() 执行commad属性所定义的函数
属性名称 说明
activebackground 按钮在作用时的背景颜色
activeforeground 按钮在作用时的前景颜色
bitmap 显示在按钮上的位图,这个属性只有在忽略image属性的时候才有用。
一般可以设置gary12,gary25,gary50,gary75,hourglass、error、questhead、info、warning或queetion,也可以直接使用XBM( X Bitmap文件)eg:bitmap=@hello.xbm
default 默认按钮
disabledforeground 按钮在无作用时的前景颜色
image 显示在按钮上的图片,这个属性的顺序在text和bitmao属性之前
state 定义按钮的属性。NORMAL(正常)、ACTIVE(激活)、DISABLED(禁用)
takefocus 定义用户是否可以使用Tab键来改变按钮的焦点
text 显示在按钮上的文字,如果定义了image和bitmap属性,text属性就不会显示
underline 一个整数偏移值,表示按钮上的文字哪一个字符要加下划线,第一个字符的偏移值为0
wraplength 一个以屏幕单位(screen unit)为单位的距离值,用来决定按钮上的文字在哪里需要换成多行。
默认值是不换行
command 指定按钮的事件处理函数
  1. from tkinter import *
  2. win = Tk()
  3. ##设置按钮作用时的前景颜色和背景颜色
  4. button1 = Button(win,activeforeground="#FF4040",activebackground="#FFDEAD",text="关闭",command=win.quit).pack()
  5. ##设置bitmap
  6. button2 = Button(win,bitmap="question",text="bitmap",command=win.quit).pack()
  7. ##设置text和bitmap,但是由于有bitmap,所以text不生效
  8. button3 = Button(win,bitmap="info",text="bitmap",command=win.quit).pack()
  9. ##在第三个字符下面加下划线
  10. button4 = Button(win,text="今天也要加油鸭!",underline=2,command=win.quit).pack()
  11. ##开始窗口的的事件循环
  12. win.mainloop()

image.png

6.2 Canvas 控件

Canvas控件用于创建与显示图形,eg:弧形、位图、图片、线条、椭圆形、多边形及矩形等

方法 说明
create_arc(coord,start,exten,fill) 创建一个弧形
coord定义画弧形区块的左上角和右下角坐标
start定义画弧形区块的起始角度(逆时针方向)
extent定义画弧形区块的结束角度(逆时针)
fill定义填满弧形区块的颜色
create_bitmap(x,y,bitmap) 创建一个位图
x和y定义位图的左上角坐标
bitmap定义位图的来源,可以为gary12,gary25,gary50,gary75,hourglass、error、questhead、info、warning或queetion,也可以直接使用XBM( X Bitmap文件)eg:bitmap=@hello.xbm
create_image(x,y,image) 创建一个图片
x和y定义图片的左上角坐标
image定义图片的来源,必须是tkinter模块的BitmapImage类或PhotoImage类的实例变量
create_line(x0,y0,x1,y1,……,xn,yn,options) 创建一个线条
x0,y0,x1,y1,……,xn,yn 定义线条的坐标
optinos可以是width或fill
width定义线条的宽度,默认为1像素
fill定义线条的颜色,默认为black
create_oval(x0,y0,x1,y2,options) 创建一个圆形或椭圆形
x0和y0定义绘图区域的左上角坐标
x1和y1定义回值区域的右下角坐标
optinos可以是outline或fill
outline定义圆形或椭圆形的外围颜色
fill定义填满圆形或椭圆形的颜色,默认值为empty(透明)
create_polygon(x0,y0,x1,y1……,options) 创建一个至少三个点的多边形
x0,y0,x1,y1,……,xn,yn 定义多边形的坐标
optinos可以是outline、fill或splinesteps
outline定义圆形或椭圆形的外围颜色,默认值为balck
fill定义填满多边形的颜色,默认值为black
splinesteps是一个整数,定义曲线的平滑度
create_rectangle(x0,y0,x1,y1,options) 创建一个矩形
x0和y0定义矩形的左上角坐标
x1和y2定义矩形的右下角坐标
optinos可以是outline或fill
outline定义圆形或椭圆形的外围颜色,默认值为balck
fill定义填满圆形或椭圆形的颜色,默认值为empty(透明)
create_text(x0,y0,text,options) 创建一个文字字符串
x0和y0定义字符串的左上角坐标
text定义文字字符串的文字
options可以是anchar或fill
anchar定义(x0,y0)在文字字符串内的位置,可以是N、NE、E、SE、S、SW、W、NW或CENTER
默认值是CENTER
fill定义文字字符串的颜色,默认值为empty(透明)
  • 报错

python报错: _tkinter.TclError: couldn’t recognize data in image file
用tkinter只能装入GIF图片,也就是扩展名是.gif的图片文件,想要显示其他类型的图片,如png或jpg,需要用到其它模块

  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("Canvas组件示例")
  4. ##创建一个弧形
  5. coord = 13,50,240,213
  6. canvas1 = Canvas(win)
  7. canvas1.create_arc(coord,start=0,extent=270,fill="#98FB98")
  8. canvas1.pack(side=TOP)
  9. ##创建一个位图
  10. canvas2 = Canvas(win)
  11. canvas2.create_bitmap(20,20,bitmap="warning")
  12. canvas2.pack(side=TOP)
  13. ##创建一个图片
  14. canvas3 = Canvas(win)
  15. img = PhotoImage(file="C:/Users/lh/Desktop/lhuan.gif")
  16. canvas3.create_image(20,280,image=img)
  17. canvas3.place(x=40,y=200)
  18. ##创建一个线条
  19. canvas4 = Canvas(win)
  20. canvas4.create_line(150,200,175,250,20,150,width=5,fill="#8B1A1A")
  21. canvas4.pack()
  22. win.mainloop()

image.png image.png

  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("Canvas组件示例")
  4. ##画一个圆形
  5. canvas1 =Canvas(win)
  6. canvas1.create_oval(10,10,100,100,fill="#FFE4B5",outline="#FFFF00")
  7. canvas1.pack()
  8. ##画一个三角形
  9. canvas2 =Canvas(win)
  10. canvas2.create_polygon(30,30,150,150,120,180,fill="#FFE4B5",outline="#FFFF00",splinesteps=1)
  11. canvas2.pack()
  12. ##画一个矩形
  13. canvas3 =Canvas(win)
  14. canvas3.create_rectangle(80,80,200,200,fill="#FFE4B5",outline="#FFFF00")
  15. canvas3.pack()
  16. ##创建一个文字字符串
  17. canvas4 =Canvas(win)
  18. canvas4.create_text(125,5,text="白莲庭院皆生妙处",fill="black",anchor=N)
  19. canvas4.pack()
  20. ##开始窗口的的事件循环
  21. win.mainloop()

6.3 Checkbutton 控件

Checkbutton控件用于创建复选框

属性 说明
onvlaue,offvalue 设置Checkbutton控件的variable属性指定的变量,所要存储的数值
如果复选框没有被选中,值为offvalue
如果复选框被选中,值为onvalue
indicatoron 置为0,可以将整个控件变成复选框
方法 说明
select() 选中复选框,并设置变量的值为onvalue
flash() 将前景和背景颜色互换,以产生闪烁的效果
invoke() 执行command属性所定义的函数
toggle() 改变复选框的状态,如果复选框现在的状态是on,就改为off,如果是off,就改为on
  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("Checkbutton组件示例")
  4. check1 = Checkbutton(win,text="apple")
  5. check2 = Checkbutton(win,text="pear")
  6. check3 = Checkbutton(win,text="orange")
  7. ##选中按钮1
  8. check1.select()
  9. check1.pack(side=LEFT)
  10. check2.pack(side=LEFT)
  11. check3.pack(side=LEFT)
  12. ##开始窗口的的事件循环
  13. win.mainloop()

image.png

6.4 Entry 控件

Entry控件用于在窗体或窗口内创建一个单行文本框。

属性 说明
insertwidth 输入框光标的宽度
insertonotime 输入框光标闪烁时,显示持续时间,单位:毫秒(ms),默认值为600ms
insertofftime 输入框光标闪烁时,消失持续时间,单位:毫秒(ms),默认值为300ms
justify 当输入的文本不适应输入框时的显示方式
left/center/wight,默认为left
show 指定输入框内容显示为字符,eg:显示密码可以将值设为*
textvariable 输入框的值,是一个StringVar()对象
xscrollcommand 建立与滚动条组件的联系,设置为滚动条组件的.set方法
方法 说明
inster(index,text) 向输入框中输入字符,index:插入位置,text:插入内容
delete(first,last) 删除输入框中从first到last(不包含last)的字符串
get() 获取输入框的字符串值
select_clear() 清除输入框选择的内容
icursor(index) 将光标移动到index索引位置前,文框获取焦点后成立
index(index) 返回指定的索引值,保证index位置上的字符是输入框最左侧的可视字符
select_range(start,end) 选中start索引与end索引之前的值,start必须小于end
  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("计算器")
  4. ##创建窗体
  5. frame = Frame(win)
  6. ##创建一个计算器
  7. def calc():
  8. #将用于输入的表达式,计算结果后转换成字符串
  9. result = "=" +str(eval(expression.get()))
  10. #将计算的结果显示在Label控件上
  11. label.config(text=result)
  12. ##创建一个label控件
  13. label = Label(frame)
  14. ##创建一个Entry控件
  15. entry = Entry(frame)
  16. ##读取用户输入的表达式
  17. expression = StringVar()
  18. ##将用户输入的表达式显示在Entry控件上
  19. entry["textvariable"] = expression
  20. ##创建一个Button控件,当用户输入完毕之后,单击此按钮即计算表达式的结果
  21. button1 = Button(frame, text="等于",command=calc)
  22. ##设置Entry控件为焦点所在
  23. entry.focus()
  24. frame.pack()
  25. entry.pack()
  26. label.pack(side = LEFT)
  27. button1.pack(side = RIGHT)
  28. ##开始窗口的的事件循环
  29. win.mainloop()

image.png

6.5 Label 控件

label用于创建一个显示方块,可以在这个显示方块中放置图片或文字。

属性 说明
text 文字,多行以“\n”分割
windth 标签的宽度,显示文本,以单个字符大小为单位,显示图像,以像素为单位
height 标签的高度,显示文本,以单个字符大小为单位,显示图像,以像素为单位
anchar 文本或图像在背景内容区的位置,
background(bg) N、NE、E、SE、S、SW、W、NW或CENTER
默认值是CENTER
relief 边框样式,flat(默认)/sunken/raised/groove/ridge
borderwidth(bd) 边框的宽度,单位是像素
font 字体和字体的大小,font=(font_name,size)
justify 指定文本对齐方式,center(默认)/left/right
foreground(fg) 指定文本(或图像)颜色
underline 单个字符添加下划线
bitmap 指定标签上显示的位图
image 指定标签上显示的图片
compound 文本的图像的位置关闭。None(默认,即显示图像不显示文本)
bottom/top/left/right 图片显示在文本的下/上/左/右
center 文本显示在图片中心上方
activebackground 设置Label处于活动状态下的背景颜色,默认由系统指定
activeforground 设置Label处于活动状态下的前景颜色,默认由系统指定
disableforground 指定当Label不可用的状态Disable下的前景颜色,默认由系统指定
cursor 指定鼠标经过Label的时候,鼠标的样式
state 指定Label的状态,用于控制Label如何显示
normal/active/disable
  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("Label控件示例")
  4. label1 = Label(win,text="我们读书而后知道自己并不孤单。\n ----《岛上书店》",height=10,width=50,relief=RAISED,background="white",foreground="black",anchor='center',font=("宋体",20),cursor='man')
  5. label1.pack()
  6. ##x是tkinter的PhotoImage实例化后的实例变量
  7. x = PhotoImage(file="C:/Users/lh/Desktop/lhuan.gif")
  8. label2 =Label(win,image=x,text="图片",compound="bottom")
  9. label2.pack()
  10. #开始窗口的的事件循环
  11. win.mainloop()

image.png

6.6 Listbox 控件

Listbox控件用于创建一个列表框。列表框内包含多个选项,用户可以只选择一个或者多个

属性 说明
height 设置列表框的行数目,如果为0,自动设置为能找到的最大选择项数目
selectmode 设置列表框的种类
SINGLE:单选
BROWSE:单选,拖动鼠标或通过方向键可以选择多行
MULTIPLE:多选
EXTENDED:多选,但需要同时按住shift键或Ctrl键或者拖拽鼠标实现
width 设置每一行的字符数目,如果为0,自动设置为能找到的最大字符数目
xscrollcommand 水平滚动条联系变量
yscrollcommand 垂直滚动条联系变量
listvaribale 列表框内容的StringVar变量,可以用.get() 方法得到列表框内容的字符串
方法 说明
delete(row[,lastrow] 删除指定和row,或者删除row或lastrow之间的行
get(row) 取得指定行row内的字符串
insert(row,string) 在指定列row插入字符串string
see(row) 将指定行row变成可视
select_clear() 清除选择项
select_set(startrow,endrow) 选择startrow与endrow之间的行
curselection() 获取选中列表项索引值的元组
  1. from tkinter import *
  2. win = Tk()
  3. win.wm_title("Listbox 控件示例")
  4. ##创建窗体
  5. frame = Frame(win)
  6. ##创建列表框选项列表
  7. name = ["芝芝草莓","可乐冰茶","草莓星冰乐","蓝莓星冰乐","草莓奶昔","柠檬百香果"]
  8. ##创建Listbox控件
  9. listbox =Listbox(frame)
  10. ##清除Listbox控件的内容
  11. listbox.delete(0,END)
  12. ##在Listbox控件内插入选项
  13. for i in range(5):
  14. listbox.insert(END, name[i])
  15. listbox.pack()
  16. frame.pack()
  17. #开始窗口的的事件循环
  18. win.mainloop()

image.png

6.7 Menu 控件

Menu控件用于创建三种类型的菜单,pop-up(快捷式菜单)、toplevel(主目录)及pull-down(下拉式菜单)

方法 说明
add_command(options) 新增一个菜单项
add_radiobuttom(options) 创建一个选择纽菜单栏
add_checkbutton(options) 创建一个复选框菜单栏
add_cascade(options) 将指定的菜单与其菜单连接,创建一个新的级联菜单
add_separartor() 新增一个分割线
add(type,options) 新增一个特殊类型的菜单栏
delete(startindex [,endindex]) 删除startindex到endindex之间的菜单栏
entryconfig(index,options) 修改index菜单栏
index(item) 返回索引值的菜单栏选项
方法 说明
accelerator 设置菜单栏的快捷键,快捷键会显示在菜单项目的右边。
ps:这个选项不会自动将快捷键与菜单栏连接在一起,必须另行设置
command 选择菜单项时执行的callback函数
indicatorOn 设置此属性,让菜单栏选择on或off
label 定义菜单栏内的文字
menu 此属性与add_cascade() 方法一起使用,用来新增菜单栏的子菜单栏
selectColor 菜单栏on或off的颜色
state 定义菜单栏的状态,可以是normal、active、disabled
onvaue,offvalue 存储在variable属性内的数值。
在选择菜单栏时,将onvalue内的数值复制到variable属性内
tearOff 如果这个选项为True,在菜单项目的上面就会显示一个可选择的分割线。
这个分割线,会将此菜单栏分离出来成为一个新的窗口
underline 设置菜单栏中哪一个字符要有下划线
value 选择按钮菜单项的值
variable 用于存储数值的变量

6.7.1 toplevel 主菜单

  1. from tkinter import *
  2. import tkinter.messagebox
  3. ##创建主菜单
  4. win = Tk()
  5. ##执行菜单命令,显示一个对话框
  6. def doSomething():
  7. tkinter.messagebox.askokcancel("菜单","你正在选择菜单命令")
  8. ##创建一个主目录(toplevel)
  9. mainmenu = Menu(win)
  10. ##新增菜单项
  11. mainmenu.add_command(label= "文件",command=doSomething)
  12. mainmenu.add_command(label= "编辑",command=doSomething)
  13. mainmenu.add_command(label= "视图",command=doSomething)
  14. mainmenu.add_command(label= "窗口",command=doSomething)
  15. mainmenu.add_command(label= "帮助",command=doSomething)
  16. ##设置主窗口的菜单
  17. win.config(menu=mainmenu)
  18. ##开始程序循环
  19. win.mainloop()

image.png

6.7.2 pop-up 快捷式菜单

  1. from tkinter import *
  2. import tkinter.messagebox
  3. ##创建主窗口
  4. win = Tk()
  5. ##执行菜单命令,显示一个对话框
  6. def doSomething():
  7. tkinter.messagebox.askokcancel("菜单","你正在选择快捷式菜单命令")
  8. ##创建一个快捷式菜单(pop-up)
  9. popupmenu = Menu(win,tearoff=0)
  10. ##新增快捷式菜单的项目
  11. popupmenu.add_command(label="复制",command=doSomething)
  12. # ##添加分割线
  13. popupmenu.add_separator()
  14. popupmenu.add_command(label="粘贴",command=doSomething)
  15. popupmenu.add_separator()
  16. popupmenu.add_command(label="剪切",command=doSomething)
  17. popupmenu.add_separator()
  18. popupmenu.add_command(label="删除",command=doSomething)
  19. popupmenu.add_separator()
  20. ##在点击鼠标右键的窗口(x,y)座标出,显示此快捷式菜单
  21. def showpopupMenu(event):
  22. popupmenu.post(event.x_root,event.y_root)
  23. ##设置单击鼠标右键后,显示此快捷式菜单
  24. win.bind("<Button-3>",showpopupMenu)
  25. ##开始程序循环
  26. win.mainloop()

image.png 单击鼠标右键之后 image.png

6.7.3 pull-down 下拉式菜单

  1. ##创建一个下拉式菜单
  2. from tkinter import *
  3. import tkinter.messagebox
  4. ##创建主窗口
  5. win =Tk()
  6. ##执行[文件/新建]菜单命令,显示一个对话框
  7. def doFileNewCommand(*arg):
  8. tkinter.messagebox.askokcancel("菜单","你正在选择'新建'菜单命令")
  9. ##执行[文件/打开]菜单命令,显示一个对话框
  10. def doFileOpenCommand(*arg):
  11. tkinter.messagebox.askokcancel("菜单","你正在选择'打开'菜单命令")
  12. ##执行[文件/保存]菜单命令,显示一个对话框
  13. def doFileSaveCommand(*arg):
  14. tkinter.messagebox.askokcancel("菜单","你正在选择'保存'菜单命令")
  15. ##执行[帮助/档]菜单命令,显示一个对话框
  16. def doHelpContentsCommand(*arg):
  17. tkinter.messagebox.askokcancel("菜单","你正在选择'帮助文档'菜单命令")
  18. def doHelpCommand(*arg):
  19. tkinter.messagebox.askokcancel("菜单","你正在选择'关于'菜单命令")
  20. ##创建一个下拉式菜单(pull-down)
  21. mainmenu = Menu(win)
  22. ##新增“文件”菜单的子菜单
  23. filemenu = Menu(mainmenu,tearoff=0)
  24. ##新增“文件”菜单的菜单项
  25. filemenu.add_command(label ="新建",command=doFileNewCommand,accelerator ="Ctrl-N") ##设置快捷键
  26. filemenu.add_command(label ="打开",command=doFileOpenCommand,accelerator ="Ctrl-O")
  27. filemenu.add_command(label ="保存",command=doFileSaveCommand,accelerator="Ctrl-S")
  28. filemenu.add_command(label ="退出",command=win.quit)
  29. ##新增“文件”菜单
  30. mainmenu.add_cascade(label="文件",menu=filemenu) ##创建新的级联菜单
  31. ##新增"帮助"菜单的子菜单
  32. helpmenu = Menu(mainmenu,tearoff=0)
  33. ##新增”帮助“菜单的菜单项
  34. helpmenu.add_command(label="文档",command=doHelpContentsCommand,accelerator="F1")
  35. helpmenu.add_command(label="关于",command=doHelpCommand,accelerator="Ctrl-A")
  36. ##新增”帮助菜单“
  37. mainmenu.add_cascade(label="帮助",menu=helpmenu)
  38. ##设置主窗口的菜单
  39. win.config(menu = mainmenu)
  40. ##设置键盘事件绑定
  41. win.bind("<Control-N>",doFileNewCommand)
  42. win.bind("<Control-n>",doFileNewCommand)
  43. win.bind("<Control-O>",doFileOpenCommand)
  44. win.bind("<Control-o>",doFileOpenCommand)
  45. win.bind("<Control-S>",doFileSaveCommand)
  46. win.bind("<Control-s>",doFileSaveCommand)
  47. win.bind("<Control-A>",doHelpCommand)
  48. win.bind("<Control-a>",doHelpCommand)
  49. win.bind("<F1>",doHelpContentsCommand)
  50. ##开始程序循环
  51. win.mainloop()

image.png

6.8 Message 控件

Message控件用于显示多行、不可编辑的文字。Message会自动分行,并编排文字的位置。

  1. from tkinter import *
  2. ##创建主窗口
  3. win = Tk()
  4. txt = "君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。人生得意须尽欢,莫使金樽空对月。天生我材必有用,千金散尽还复来。烹羊宰牛且为乐,会须一饮三百杯。"
  5. msg = Message(win,text=txt)
  6. msg.pack()
  7. ##开始窗口的的事件循环
  8. win.mainloop()

image.png

6.9 Radiobutton 控件

Radiobutton控件用于创建一个单选按钮。
为了让一群单选按钮可以执行相同的功能,必须设置这群单选按钮variable属性为相同值,value属性就是各单选按钮的数值。

属性 说明
command 当用户选中此单选按钮时,所调用的函数
variable 当用户单选中单选按钮时,要更新的变量
width 当用户选中此单选按钮时,要存储在变量中的值
方法 说明
flash() 将前景与背景颜色互换,以产生闪烁的效果
invoke() 执行command属性所定义的函数
select() 选择此单选按钮,将variable变量的值设置为value
  1. from tkinter import *
  2. ##创建主窗口
  3. win =Tk()
  4. win.wm_title("创建单选按钮")
  5. ##饮品列表
  6. drinks = ["芝芝草莓","草莓星冰乐","草莓优格","杨枝甘露","草莓果冻","芝士草莓蛋糕","冰博克牛奶","草莓桃桃酸奶"]
  7. ##将用户的选择显示在Label标签上
  8. def showSelection():
  9. choice = "你的选择: "+ drinks[var.get()]
  10. label.config(text=choice)
  11. ##读取用户的选择值,是一个整数
  12. var =IntVar()
  13. for i in range(len(drinks)):
  14. Radiobutton(win,text=drinks[i],variable=var,value=i,command=showSelection).pack(anchor=W)
  15. ##创建文字标签,用于显示用户的选择
  16. label = Label(win)
  17. label.pack()
  18. ##开始窗口的的事件循环
  19. win.mainloop()

image.png image.png

  1. from tkinter import *
  2. ##创建主窗口
  3. win = Tk()
  4. win.wm_title("创建命令型的单选按钮")
  5. ##饮品列表
  6. drinks = ["柠檬红茶","柠檬百香果","柠檬绿茶","金桔柠檬","冰鲜柠檬水","香水青柠","柚子柠檬","紫宁柠檬茶"]
  7. ##将用户的选择显示在Label标签上
  8. def showSelection():
  9. choice = "你的选择是: "+drinks[var.get()]
  10. label.config(text=choice)
  11. ##读取用户的选择值,是一个整数
  12. var= IntVar()
  13. for i in range(len(drinks)):
  14. ##创建单选按钮
  15. radioi=Radiobutton(win,text=drinks[i],variable=var,value=i,command=showSelection)
  16. ##将单选按钮的外型,设置成命令型按钮
  17. radioi.config(indicatoron=0)
  18. ##将单选按钮靠左对齐
  19. radioi.pack(anchor=W)
  20. ##创建文字标签,用于显示用户的选择
  21. label = Label(win)
  22. label.pack()
  23. ##开始窗口的事件循环
  24. win.mainloop()

6.10 Sacle 控件

Scale控件用于创建一个标尺式的滑动条对象,让用户可以移动标尺上的光标来设置数值。

方法 说明
get() 取得目前标尺上的光标值
set(value) 设置当前标尺上的光标值
  1. from tkinter import *
  2. from string import *
  3. ##创建主窗口
  4. win = Tk()
  5. win.wm_title("选择RGB颜色的滑块控件")
  6. ## 将标尺上的0-130范围内的数字转换为0-255范围的16进制数字,然后再转换为两个字符的字符串,如果数字只有一位,就在前面一位加一个零
  7. def getRBGStr(value):
  8. ret = str(hex(int(value/133*255)))
  9. ##将十六进制为数字前面的0x去掉
  10. ret = ret[2:4]
  11. ##转换成两个字符的字符串,如果数字只有一位,就在前面加一个零
  12. #zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
  13. ret = ret.zfill(2)
  14. return ret
  15. ##将RGB颜色的字符转成为#rrggbb 类型的字符串
  16. def showRGBColor():
  17. ##读取rr部分
  18. strR = getRBGStr(var1.get())
  19. ##读取gg部分
  20. strG = getRBGStr(var2.get())
  21. ##读取bb部分
  22. strB = getRBGStr(var3.get())
  23. ##转换成#rrggbb类型的字符串
  24. color = "#"+strR+strG+strB
  25. #将颜色字符串设置为Label控件的背景颜色
  26. colorBar.config(background=color)
  27. ##读取标尺
  28. var1 =DoubleVar()
  29. var2 =DoubleVar()
  30. var3 =DoubleVar()
  31. ##创建标尺
  32. scale1=Scale(win,variable=var1)
  33. scale2=Scale(win,variable=var2)
  34. scale3=Scale(win,variable=var3)
  35. ##将选择按钮向左对齐
  36. scale1.pack(side=LEFT)
  37. scale2.pack(side=LEFT)
  38. scale3.pack(side=LEFT)
  39. ##创建一个标签,用于显示颜色字符串
  40. colorBar = Label(win,text=""*40,background="#000000",width="20",height="5")
  41. colorBar.pack(side=LEFT)
  42. ##创建一个按钮,单击后将标尺上的RGB颜色显示在Label控件上
  43. button = Button(win,text="查看颜色",command=showRGBColor)
  44. button.pack(side=LEFT)
  45. ##开始窗口的事件循环
  46. win.mainloop()

image.png image.png

6.11 Scalebar 控件

Scalebar控件用于创建一个水平或垂直的滚动条,可与Listbox、Text、Canvas等控件共同使用来移动显示的范围。

方法 说明
set(first,last) 设置目前的显示范围,在0-1之间
get() 返回目前的滚动条
  1. from tkinter import *
  2. ##创建主窗口
  3. win=Tk()
  4. win.wm_title("滚动条控件")
  5. ##创建一个水平滚动条
  6. scrollbar1 = Scrollbar(win,orient=HORIZONTAL)
  7. ##水平滚动条位于窗口底端,当窗口改变大小的时候会在x方向填满窗口,x需要大写
  8. scrollbar1.pack(side=BOTTOM,fill=X)
  9. ##创建一个垂直滚动条
  10. scrollbar2 = Scrollbar(win,orient=VERTICAL)
  11. ##垂直滚动条位于窗口右端,当窗口改变大小的时候会在y方向填满窗口
  12. scrollbar2.pack(side=RIGHT,fill=Y)
  13. ##创建一个列表框,x方向的滚动条是scrollbar1对象的set()方法,y方向的滚动条是scrollbar2对象的set()方法
  14. mylist = Listbox(win,xscrollcommand=scrollbar1.set,yscrollcommand=scrollbar2.set,width=100)
  15. ##在列表中插入20个选项
  16. for i in range(20):
  17. mylist.insert(END,"汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。春寒赐浴华清池,温泉水滑洗凝脂。"+str(i))
  18. ##列表框位于窗口的左端,当窗口改变的时候会在x和y方向上填满窗口
  19. mylist.pack(side=LEFT,fill =BOTH)
  20. ##移动水平滚动条,改变列表框的x方向可见范围
  21. scrollbar1.config(command=mylist.xview)
  22. ##移动垂直滚动条,该表列表框的y方向可见范围
  23. scrollbar2.config(command=mylist.yview)
  24. ## 开始窗口的事件循环
  25. win.mainloop()

image.png

6.12 Text 控件

Text控件用于创建一个多行、格式化的文本框。

属性 说明
state normal或disabled
normal表示此文本框可以编辑内容
disabled表示此文本框不可编辑内容
tabs tab位置的列表
列表的元素是tab位置的索引值,再加上一个调整字符l、r、c
l:left、r:right、c:center
方法 说明
delete(startindex [,endindex] 删除特定位置的字符,或者一个范围内的文字
get(startindex[,endindex] 返回特定位置的字符,或者一个范围内的文字
index(index) 返回指定索引值的绝对值
insert(index [,string]……) 将字符串插入指定索引值的位置
see(index) 如果指定索引值的文字是可见的,就返回T

Text控件支持三种特殊结构:Mark、Tag和Index

6.11.1 Mark

Mark用作书签,可以帮助用户快速找到文本框内容的指定位置。
INSERT:指定光标插入的位置
CURRENT:指定鼠标光标最近的位置

方法 说明
index(mark) 返回书签行与列的位置
mark_gravity(mark [,gravity]) 返回书签的gravity。如果指定了gravity参数,就设置gravity为书签。
这个方法用在要将插入的文字准确地放在书签的位置时
mark_names() 返回Text控件的所有书签
mark_set(mark,index) 设置书签的新位置
mark_unset(mark) 删除Text控件的指定书签

6.11.2 Tag

Tag用来将一个范围内的文字指定一个标签名称,也可以用于将一个范围与一个callback函数连接。

方法 属性
tag_add(tagname,startindex [,endindex]……) 将startindex到endindex之间范围指定为tagname名称
tag_config() 用来设置tag属性
选项可以是justify,值可以是left、right、center
选项可以是tabs,tabs与Text控件的tag属性功能相同
选项可以是underline,在标签文字内加下划线
tag_delete(tagname) 删除指定的tag标签
tag_remove(tagname,startindex [,endindex]……) 将startinde到endindex之间的范围指定的tag标签删除

6.11.1 Index

Index用于指定字符的真实位置。
image.png

  1. from tkinter import *
  2. ##创建主窗口
  3. win =Tk()
  4. win.wm_title("Text控件")
  5. ##创建一个Text控件
  6. text = Text(win)
  7. ##在Text控件中插入一段文字
  8. text.insert(INSERT,"鸳鸯瓦冷霜华重,翡翠衾寒谁与共?\n")
  9. ##跳下一行
  10. text.insert(INSERT,"\n")
  11. ##在Text控件中插入一个按钮
  12. button = Button(win,text="关闭",command=win.quit)
  13. text.window_create(END,window=button)
  14. text.pack(fill=BOTH)
  15. ##在第一行文字的中插入标签,print
  16. text.tag_add("print","1.5","1.7")
  17. ##将插入的按钮设置其标签名称为button
  18. text.tag_add("button",button)
  19. ##改变标签print的前景颜色和背景颜色,并加下划线
  20. text.tag_config("print",background="pink",foreground="black",underline=1)
  21. ##设置标签button的居中排列
  22. text.tag_config("button",justify="center")
  23. ## 开始窗口的事件循环
  24. win.mainloop()

6.13 Toplevel 控件

Toplevel用于创建一个独立窗口,这个独立窗口可以不必有父控件。

属性 说明
deiconify() 使用iconify()或withdraw()方法后,显示这个窗口
frame() 返沪一个系统特定的窗口识别码
group(window) 将此窗口加入window窗口群组中
iconify() 将窗口缩小成小图标
protocol(name,function) 将function函数登记为callback函数
state() 返回目前窗口的状态
normal、iconic、withdrawn、icon
transient([master]) 将此窗口转换为master或父窗口的暂时窗口。
当master变成小图标的时候,此窗口也会隐藏起来
withdraw() 将此窗口从屏幕上关闭,但不删除
方法 说明
aspect(minNumber,minDenom,masNumber,masDenmon) 设置窗口宽度和长度的值,比值必须在minNumber/minDenom和masNumber/masDenmon之间
client(name) 使用在x window系统中
用于定义WM_CLIENT_MACHINE属性
colormapwindows(wlist……) 使用在x window系统中
用于定义WM_COLORMAO_WINDOWS属性
command(value) 使用在x window系统中
用于定义WM_COMMAND属性
focusmode(model) 设置焦点模型
geometry(geometry) 使用widthheight+xoffset+yoffset的格式改变窗口的几何设置
iconbitmap(bitmap) 定义窗口变成小图标的时候,所使用的单色位图图标
iconmask(bitmap) 定义窗口变成小图标的时候,所使用的单色位图屏蔽
iconname(newName=None) 定义窗口变成小图标的时候,所使用的图标名称
iconposition(x,y) 定义窗口变成小图标的时候,窗口的x,y位置
iconwindow(window) 定义窗口变成小图标的时候,所使用的图标窗口
maxsize(width,height) 定义窗口的最大值
minsize(width,height) 定义窗口的最小值
overrideredirect(flag) 定义一个非零的标志
position(who) 定义位置控制器
resizable(width,height) 定义是否可以改变窗口大小的标志
sizefrom(who) 定义大小控制器
title(string) 定义窗口的标题

七、对话框

7.1 messagebox模块

  1. askokcancel(title=None,message=None) 打开一个“确定/取消”的对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.askokcancel("提示","你确定要关闭窗口吗?")

    image.png

  2. messagebox.askquestion(title=None,message=None) 打开一个“是/否”的对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.askquestion("提示","你确定要关闭窗口吗?")

    image.png

  3. messagebox.askretrycancel(title=None,message=None) 打开一个“重试/取消”的对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.askretrycancel("提示","你确定要关闭窗口?")

    image.png

  4. messagebox.askyesno(title=None,message=None) 打开一个“是/否”的对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.askyesno("提示","你确定要关闭窗口吗?")

    image.png

  5. messagebox.showerror(title=None,message=None) 打开一个错误提示对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.showerror("提示","你确定要关闭窗口吗?")

    image.png

  6. messagebox.showinfo(title=None,message=None) 打开一个信息提示对话框

    1. import tkinter.messagebox
    2. tkinter.messagebox.showinfo("提示","你确定要关闭窗口吗?")

    image.png

  7. messagebox.showwarning(title=None,message=None) 打开一个警告提示对话框image.png

    7.2 filedialog模块

    | 方法 | 说明 | | —- | —- | | Open(master=None,filetypes=None) | 打开一个“打开旧文件”的对话框
    filetypes是要打开的文件类型,为一个列表 | | SaveAs(master=None,filetypes=None) | 打开一个“另存新文件”的对话框
    filetypes是要打开的文件类型,为一个列表 |

image.png
image.png image.png

  1. from tkinter import *
  2. import tkinter.filedialog
  3. ##创建主窗口
  4. win = Tk()
  5. win.title (string="打开和保存文件")
  6. ##打开一个[打开旧文件]对话框
  7. def createOpenFileDialog():
  8. myDialog1.show()
  9. ##打开一个[另存新文件]对话框
  10. def createSaveAsDialog():
  11. myDialog2.show()
  12. ##单击按钮后,即打开对话框
  13. Button(win,text="打开文件",command=createOpenFileDialog).pack(side=LEFT)
  14. Button(win,text="另存文件",command=createSaveAsDialog).pack(side=LEFT)
  15. ##设置对话框打开的文件类型
  16. myFileTypes =[('Python file',"*py *.pyw"),('ALL files','*')]
  17. ##创建一个[打开旧文件]对话框
  18. myDialog1 = tkinter.filedialog.Open(win,filetypes=myFileTypes)
  19. myDialog2 = tkinter.filedialog.SaveAs(win,filetypes=myFileTypes)
  20. ## 开始窗口的事件循环
  21. win.mainloop()

7.3 colorchooser模块

用于打开“颜色”对话框

方法 说明
skcolor(color=None) 直接打开一个“颜色”的对话框,不需要父控件与show()方法
返回值一个元素,其格式 ((R ,G ,B), “#rrggbb”)
Chooser(master=None) 打开一个“颜色”的对话框
返回值是一个元组,其格式 ((R ,G ,B), “#rrggbb”)
  1. from tkinter import *
  2. import tkinter.colorchooser,tkinter.messagebox
  3. ##创建主窗口
  4. win = Tk()
  5. win.title(string="颜色对话框")
  6. ##打开一个[颜色]的对话框
  7. def openColorDialog():
  8. ##显示[颜色]对话框
  9. color =colorDialog.show()
  10. ##显示选择颜色的RGB值
  11. tkinter.messagebox.showinfo("提示","你选择的颜色是:" + color[1] + "\n" + "R=" + str(color[0][0]) + "G=" + str(color[[0][1]]) + " B=" + str(color[[0][2]]))
  12. ##单击按钮后,即打开对话框
  13. Button(win,text="打开颜色对话框",command=openColorDialog).pack(side=LEFT)
  14. ##创建一个[颜色]对话框
  15. colorDialog = tkinter.colorchooser.Chooser(win)
  16. ## 开始窗口的事件循环
  17. win.mainloop()

image.png