tkinter
什么是 Tkinter
简单介绍
Tkinter 是使用 python 进行窗口视窗设计的模块. 简单的构造, 多平台, 多系统的兼容性, 能让它成为让你快速入门定制窗口文件的好助手. 它在 python 窗口视窗模块中是一款简单型的. 所以用来入门, 熟悉 窗口视窗的使用, 非常有必要.
Label & Button 标签和按钮
窗口主体框架
每一个 tkinter 应用的主体框架都可以包含下面这部分. 定义 window
窗口 和 window
的一些属性, 然后书写窗口内容, 最后执行window.mainloop让窗口活起来.
1 | import tkinter as tk |
窗口内容
这次我们会建立一个用来描述的标签 tk.Label
, 比如:
1 | l = tk.Label(window, |
我们也可以通过变量的形式控制标签的显示, 这时我们引入按钮 tk.Button
的概念, 没点一次按钮, 标签变化一次. 用一下内容替换上面的标签. 并把需要变化的文字存成变量 var
:
1 | var = tk.StringVar() # 这时文字变量储存器 |
接着我们来做 按钮 tk.Button
:
1 | b = tk.Button(window, |
那么点击是的命令我们用 if else
语句来判断. 用 on_hit
来判断当前状态.
1 | on_hit = False # 默认初始状态为 False |
Entry & Text 输入, 文本框
窗口主体框架
每一个tkinter应用的主体框架都包含以下几部分:
- 主窗口:
window
,及主窗口的一些基本属性(标题、大小) - 让窗口活起来:
window.mainloop()
1 | import tkinter as tk |
窗口内容(窗口上的控件)
创建按钮分别触发两种情况
1 | b1 = tk.Button(window,text="insert point",width=15,height=2,command=insert_point) |
创建输入框entry,用户输入任何内容都显示为*
1 | e = tk.Entry(window,show='*') |
创建一个文本框用于显示
1 | t = tk.Text(window,height=2) |
定义触发事件时的函数(注意:因为Python的执行顺序是从上往下,所以函数一定要放在按钮的上面)
1 | def insert_point(): |
Listbox 列表部件
创建主窗口
1 | window = tk.Tk() |
创建一个label用于显示
1 | var1 = tk.StringVar() #创建变量 |
创建一个方法用于按钮的点击事件
1 | def print_selection(): |
创建一个按钮
1 | b1 = tk.Button(window, text='print selection', width=15, |
创建一个Listbox和变量var2,并将var2的值赋给Listbox
1 | var2 = tk.StringVar() |
Radiobutton 选择按钮
radiobutton 部件
首先我们需要定义一个 var
用来将 radiobutton 的值和 Label 的值联系在一起. 然后创建一个radiobutton部分:
1 | var = tk.StringVar() |
其中variable=var
, value='A'
的意思就是,当我们鼠标选中了其中一个选项,把value的值A
放到变量var中,然后赋值给variable
触发功能
我们将定义一个功能, 用来对选择的 radiobutton 进行操作. print_selection
功能就是选择了某个 radiobutton 后我们会在屏幕上打印的选项.
1 | def print_selection(): |
当触发这个函数功能时,我们的 label
中就会显示 text
所赋值的字符串即 ‘you have selected’, 后面则是我们所选中的选项 var.get()
就是获取到变量 var
的值, 举个例子就是我们一开始所做的将选项 “option A” 选中时的值以 “A” 放入 var
中, 所以获取的也就是A 即如果我们这时候选中 “option A” 选项,label显示的值则是 “you have selected A”.
Scale 尺度
scale 部件
1 | s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL, |
这里的参数label
是指scale部件的名称,即在这里scale部件名称为try me
- 参数
from_=5,to=11
的意思就是从5到11,即这个滚动条最小值为5,最大值为11(这里使用from_是因为在python中有from这个关键词) - 参数
orient=tk.HORIZONTAL
在这里就是设置滚动条的方向,如我们所看到的效果图,这里HORIZONTAL
就是横向。 - 参数
length
这里是指滚动条部件的长度,但注意的是和其他部件width表示不同,width表示的是以字符为单位,比如width=4
,就是4个字符的长度,而此处的length=200
,是指我们常用的像素为单位,即长度为200个像素 - 参数
resolution=0.01
这里我们可以借助数学题来理解,我们做的很多数学题都会让我们来保留几位小数,此处的0.01就是保留2位小数,即效果图中的5.00 9.00等等后面的两位小数,如果保留一位就是resolution=0.1
这里的showvalue
就是设置在滚动条上方的显示。showvalue=0
,上方无结果显示,如果改为showvalue=1
,则显示在上面。 - 参数
tickinterval
设置的就是坐标的间隔,此处为tickinterval=2,显示的即为5.00 7.00 9.00 11.00 如果改为tickinterval=3则为5.00 8.00 11.00
触发功能
1 | l = tk.Label(window, bg='yellow', width=20, text='empty') |
这里相比前面多了参数v
,这里的参数v即将滚动条定位的数据,即如效果图中最开始,定位到5.00,label
中显示you have selected 5.00
Checkbutton 勾选项
Checkbutton部件
1 | var1 = tk.IntVar() |
参数onvalue
和前面讲的部件radiobutton
中的value相似, 当我们选中了这个checkbutton,onvalue
的值1就会放入到var1
中, 然后var1将其赋值给参数variable
,offvalue
用法相似,但是offvalue
是在没有选中这个checkbutton时,offvalue
的值1放入var1,然后赋值给参数variable
这是创建一个checkbutton部件,以此类推,可以创建多个checkbutton
触发功能
1 | def print_selection(): |
相对于前面学过的 print_selection
,这一段比较长,其实功能差不多,只不过加了if...elif...else
来选择控制而已即如代码注释,config
在前面已经讲过就是将参数text
的值显示,这里的var1.get() == 1
就是前面所说的var1获得的变量onvalue=1
,var1.get() == 0
即是var1
获得的变量offvalu=0
同理var2
也是如此。
Canvas 画布
Canvas部件
1 | canvas = tk.Canvas(window, bg='blue', height=100, width=200) |
这里的参数和以往学过的部件一样,所以就不再一一解释。
1 | image_file = tk.PhotoImage(file='ins.gif') |
这里的代码主要是实现我们最终看到的在左上角的那张小图片。 image_file = tk.PhotoImage(file='ins.gif')
这一句是创造一个变量存放ins.gif
这张图片。 image = canvas.create_image(10, 10, anchor='nw', image=image_file)
里面的参数10,10
就是图片放入画布的坐标, 而这里的anchor=nw
则是把图片的左上角作为锚定点,在加上刚刚给的坐标位置,即可将图片位置确定。 最后一个参数的意思大家应该都知道,就是将刚刚存入的图片变量,赋值给image
。
1 | x0, y0, x1, y1= 50, 50, 80, 80 |
这段代码主要实现的是画一条直线,后面()
中给的参数就是线段两点的坐标,两点确定一条直线。此处给的就是从坐标(50,50)到(80,80)画一条直线。
1 | oval = canvas.create_oval(x0, y0, x1, y1, fill='red') #创建一个圆,填充色为`red`红色 |
这里面就是创建扇形时多了两个没见过的参数start=0
和extent=180
,其实就是从0度到180度,就好像扇子的边打开一样。在我们看来就是个半圆, 如果改为extent=90
,我们看到的就是一个1/4圆
触发功能
1 | def moveit(): |
这里的触发不再是以往的print_selection了,哈哈,那么这里的是怎么样的功能呢,首先我们从单词理解来看就是移动的函数,在视频中也演示过了, 就是我们每点一次button 矩形就会移动这里canvas.move(rect, 0, 2)
的参数(rect,0,2)
就是移动rect
这个变量,即我们看到的矩形 后面的0和2,也就是横坐标移动0个单位,纵坐标移动2个单位,简单的说就是每次点击,横向不动,纵向移动两个单位。
Menubar 菜单
menubar 部件
下面是我们制作整个菜单栏的流程, 我们先需要加入一个 Menubar 作为整体框架, 然后再在 Menubar 中加一些部件.
1 | ##创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方 |
同样的我们在定义另一个菜单Edit
也是如此和定义的File
菜单一样 这里再来看一下效果中比较不一样的菜单就是File
中的Import
菜单, 在这个菜单选项中, 我们还能分支出更多的选项.
1 | submenu = tk.Menu(filemenu)##和上面定义菜单一样,不过此处实在`File`上创建一个空的菜单 |
触发功能
1 | counter = 0 |
这里的功能就是每触发一次命令,counter就会+1,在label上的显示就会从 do 0 ,do 1 , do 2…
Frame 框架
Frame 部件
Frame 是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器.
1 | ###定义一个`label`显示`on the window` |
messagebox 弹窗
messagebox部件
其实这里的messagebox
就是我们平时看到的弹窗。 我们首先需要定义一个触发功能,来触发这个弹窗 这里我们就放上以前学过的button
按钮
1 | tk.Button(window, text='hit me', command=hit_me).pack() |
通过触发功能,调用messagebox
1 | def hit_me(): |
这里点击button按钮就会弹出提示对话窗
下面给出几种形式
1 | tk.messagebox.showinfo(title='',message='')#提示信息对话窗 |
如果给出如下定义就是打印出我们所选项对应的值
1 | def hit_me(): |
同样创建方法都是一样的形式
1 | print(tk.messagebox.askquestion())#返回yes和no |
pack grid place 放置位置
pack
首先我们先看看我们常用的pack()
, 他会按照上下左右的方式排列.
1 | tk.Label(window, text='1').pack(side='top')#上 |
grid
接下里我们在看看grid()
, grid 是方格, 所以所有的内容会被放在这些规律的方格中.
1 | for i in range(4): |
以上的代码就是创建一个四行三列的表格,其实grid
就是用表格的形式定位的。这里的参数 row
为行,colum
为列,padx
就是单元格左右间距,pady
就是单元格上下间距。
place
再接下来就是place()
, 这个比较容易理解,就是给精确的坐标来定位,如此处给的(20,10)
,就是将这个部件放在坐标为(x,y)
的这个位置 后面的参数anchor=nw
就是前面所讲的锚定点是西北角。
1 | tk.Label(window, text=1).place(x=20, y=10, anchor='nw') |
案例: 登录窗口
1.界面创建
1 | # welcome image |
这里创建的就是我们效果图中的welcome, 如果你想使用和我一样的 welcome 的图片, 你可以在这里下载。
1 | # user information |
这里就是创建我们熟悉的登录界面,就是常见的用户名,密码。
1 | # login and sign up button |
这里定义的就是我们的登录按钮。
2.触发功能
1 | def usr_login(): |
3.触发的 usr_login 功能
1 | ##这两行代码就是获取用户输入的`usr_name`和`usr_pwd` |
这一部分就是将用户输入的用户名和密码获取到,和我们保存在usr_file
中的数据对比。针对正确的密码和错误的密码分别对待.
1 | #如果用户名和密码与文件中的匹配成功,则会登录成功,并跳出弹窗`how are you?`加上你的用户名。 |
4.usr_sign_up 界面
1 | window_sign_up = tk.Toplevel(window) |
这一段首先是创建一个注册的窗口。这里和以往不同的是,多了一个tk.Toplevel
我们打个比方,就好像我们前面所学 的frame
一样,就是在编辑的功能下还有很多功能一样,这里就是在主体窗口的window
上创建一个Sign up window
窗口。
1 | new_name = tk.StringVar()#将输入的注册名赋值给变量 |
相信大家对这一段代码已经很熟悉了,因为这是大家前面所学过的知识。其实就是像我们平时所见的注册窗口有一样,在Sign up window
窗口 上添加new_name
,new_pwd
, new_pwd_confirm
,还有最后一个注册按钮。这里便于大家复习,我们将new_name这段详细介绍一下(如代码注释)。 到这里就完成了我们这个注册的主要界面用户名,密码,确认密码。
5.sign_to_Mofan_Python() 功能
1 | def usr_sign_up(): |
这里其实和前面所讲的login
功能类似,如代码注释。
如果两次密码输入不一致,则提示'Error'
, 'Password and confirm password must be the same!'
如果用户名已经在我们的数据文件中,则提示'Error'
, 'The user has already signed up!'
注册成功就是我们一开始展示的效果图。
更多代码:
1 | from tkinter import * |