Python-tkinter开发学习 笔记
目录:
[TOC]
课时一
GUI:用户交互界面
kinter 介绍
是python自带的gui库,对图形图像处理库tk的封装
自带用着方便,跨平台,够用。
其他gui:pythonwin,wxpython,pyQT等等。
导入tkinter 库:import tkinter
查询官方帮助:help(tkinter)
概念介绍
- 组件:组成界面的构成内容就是组件。按钮,文本输入框,滚动条,列表,菜单等等。
- 窗口:一个软件的矩形区域。
最简单的界面
# 导入模块
import tkinter
# 创建主窗口对象
root = tkinter.T=Tk() # 实例化主体,类
# 将主窗口加入消息循环
root.mainloop()
实现简单的模块
# 导入模块
import tkinter
# 创建主窗口对象
root = tkinter.Tk() # 实例化主体,类
# 设置窗口的大小
root.minsize(300, 300) # 设置窗口的最小大小为200*200px
# 加入一个按钮的组件
# 先创建一个按钮组件
btn = tkinter.Button(root, text = '这是按钮的文本')
# root 表示将这个按钮放在哪里 (只是在内存中创建了,并没有摆放)
# 摆放按钮(最简单的)
btn.pack()
# 将主窗口加入消息循环
root.mainloop()
组件的摆放方式
- pack()方式 --> 方位摆放方法(上下左右)(不推荐使用)
a. 上(top),下(bottom),左(left),右(right) - grid()方式 --> 网格摆放方法(网格坐标)
a. 把界面变成网格,对网格横纵坐标编号.告诉坐标就可以把组件放在具体地方.
b. 适合做格子类的东西,计算器 颜色选择框等. - place()方式 --> 定位摆放方法(具体像素)
a. 也有横纵坐标单位是像素.告诉离上边有多远,离左边有多远 即可确定位置 .
b. 适合软件拖放的架构
pack()方式例子
# pack()方式:
import tkinter
root = tkinter.Tk()
---
# 创建组件
btn1 = tkinter.Button(root, text = '按钮1')
btn1.pack(sidel = 'top') # side表示放,后面值是上下左右,默认是top
# 如果是多个组件 上摞的 不好用.
# ipadx, ipady : 设置组件的内部间距.
btn1.pack(ipadx = 20, ipady = 20) # 横轴纵轴各增加20像素的空间.
# padx, pady 表示距离左右上下组件的间距 单位也是px
# fill 填充
btn1.pack(fill = 'x') # 水平方向的最大位置(一整行).
btn1.pack(fill = 'y') # 垂直方向的最大位置(一整列)但是摆放方式必须是左和右.
btn.pack(fill =
# expand 设置side是否失效.
btn1.pack(expand = 'yes') # 按钮会在中间,占用了所有组件的空间
root.mainloop()
gird() 方式例子
# 网格没有具体大小,取决于当前组件 最大组件的大小!
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按钮1')
btn1.grid() # 不设置,默认行列为0
btn1.grid(row = 0, column = 0) # 和上面一个意思
btn2 = tkinter.Button(root, text = '按钮2')
btn2.grid(row = 1, column = 0) # 行1列0
btn3 = tkinter.Button(root, text = '按钮3')
btn3.grid(row = 0, column = 1) # 行0列1
'''
如果想跨行跨列 有如下两个参数:
rowspan: 设置跨行数量
cloumnspan: 设置跨列数量
'''
btn0 = tkinter.Button(root, text = '按钮0')
btn0.grid(row = 2, column = 0, columnspan = 2, ipadx
= 20) #要设置组件的大小
btnd = tkinter.Button(root, text = ' = ')
btnd.grid(row = 0, column = 2, rowspan = 2, ipady
= 20)
root.mainloop()
place方式例子
# 两组属性,不可混合使用!!!
# 绝对定位布局
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按钮1')
btn1.place(x = 100, y = 20, width = 50, height = 50)
# 如果不设置组件位置会什么也不出现,但不报错,因为组件没有定位所以显示在看不到的地方了
# x:设置距离左上角的水平长度,y:设置距离左上角的垂直高度.
# width:设置组件所占据的宽度,height:设置组件所占的高度.
# 这种布局方式拉动主窗口,所有的组件都不会动!因为是绝对定位布局,设置多少就是多少!
# 这里所有的单位都是像素
# 相对定位布局。
# 好处是可以随界面变化而变化。
# relx:设置距离左上角的水平长度的百分比,rely:设置距离左上角的垂直高度的百分比.
# relwidth:设置组件所占据的宽度的百分比,relheight:设置组件所占的高度的百分比.
import tkinter
root = tkinter.Tk()
root.minsize(500, 500)
btn1 = tkinter.Button(root, text = '按钮1')
btn1.place(relx = 0.2, rely = 0.1, relwidth = 0.1, relheight = 0.1)
# relx:当前组件左边占整个宽度的百分比,高度同理。
# relwidth:设置当前宽度占整体宽度的10%,高度同理。
# 以上设置都是相对于界面宽度和高度的百分比,可以根据界面的大小而改变(取值是0到1)
root.mainloop()
课时二
官方文档可以搜索 python tkinter 去官网查询.
基本(标准)属性介绍
有tkinter.xxx 这个类的属性,可以选择,也可以自己写参数.
外形尺寸
import tkinter
root = tkinter.Tk()
root.minsize(500, 500) # 所有属性尽量只用默认像素或者其他字符类的值.
btn1 = tkinter.Button(root, text = '尺寸')
btn1.pack(ipadx = 100, ipady = 200) # 尺寸的绝大部分尺寸的默认单位是像素
root.mainloop()
坐标系
btn1 = tkinter.Button(root, text = '坐标系')
btn1.place(x = 100, y = 50) # 设置坐标系.
颜色
btn1 = tkinter.Button(root, text = '颜色', bg = 'blue')
# bg:按钮的背景色.
# 可以使用颜色单词
# 使用hex颜色模式(例子:#ff0000)(#红色绿色蓝色)(也就是十六进制颜色)
btn1.pack()
字体属性
btn1 = tkinter.Button(root, text = '字体', font = ('黑体',40,'bold','italic'))
# 字体设置以元祖出现,分别是 字体,字号,黑体,斜体等等.
btn1.pack()
锚点
btn1 = tkinter.Button(root, text = '锚点', anchor = 'nw')
# 锚点就是方向的代名词
# 按照上北下南左东右西 写简写值就可以.
btn1.pack(ipadx = 20, iapdy = 20)
三维效果
btn1 = tkinter.Button(root, text = '三维效果', relief = 'ridge')
# 有几种效果:flat, raised, sunken, groove, ridge
# relief关键字 = 值(字符串)即可
# 也可以用 tkinter.FLAT 替代参数.
btn1.pack(ipadx = 20, iapdy = 20)
位图
btn1 = tkinter.Button(root, text = '位图', bitmap = 'error')
# 内置的位图图标库
# bitmap 属性.
# error gray75 gray50 gray25 gray12 hourglass info guesthead question waring
# 也可以使用自己的位图文件, .xbm(x位图)格式的文件都可以用,代替标准位图名称,使用字符串@ 后跟.xbm文件的路径名.
btn1.pack(ipadx = 20, iapdy = 20)
鼠标
# 用的比较少,可以自定义鼠标的各种状态,库里自带,也可以去文档中查询
btn1 = tkinter.Button(root, text = '鼠标', cursor = 'heart')
btn1.pack(ipadx = 20, iapdy = 20)
# 如果要设置整个主窗口
root['cursor'] = 'start'
图片
# 有两种
# 第一种bmp格式和位图意思一样.很少用 略
# 第二种 PhotoImage类
# 支持.gif和.pgm和.ppm格式
# 将图片设置为图像推向
long = tkinter.PhotoImage(file = 'long.gif')
btn1 = tkinter.Button(root, text = '图片', image = long)
btn1.pack()
设置界面大小,几何字符串
imoprt tkinter
root = tkinter.Tk()
root.geometry('300x400') # 几何字符串
常用组件
Frame 框架
功能:用来承载放置其他GUI元素,就是一个容器。用来进行区域划分
# 外部的代码都是重复的省略
frame1 = tkinter.Frame(root, bg = 'black', width = 100, height = 200)
frame1.pack()
frame2 = tkinter.Frame(roott, bg = 'black' , width = 100, height = 200))
frame2.pack()
# 正常情况下是看不到这两个容器的 因为容器是虚拟的,为了方便可以加一个背景颜色就看到了
# 设定背景颜色后 看到很小的两个点 是因为虚拟容器的大小是根据它里面的内容决定的
# 我们可以用width和height参数设定容器的大小.
# 下面展示如何在框架中放入内容
# 假设要摆放按钮
btn1 = tkinter.Button(frame1, text = '按钮1')
btn1.pack(side = 'left')
btn2 = tkinter.Button(frame1, text = '按钮2')
btn2.pack(side = 'left')
btn3 = tkinter.Button(frame1, text = '按钮3')
btn3.pack(side = 'left')
# 背景会根据元素的大小调整,所以背景被覆盖了,可以在pack的时候用padx属性设置边框 就可以显示出来了
# 放到框架2 里面是一样的效果
# 但是这样依然不要用pack方式摆放东西!
Label 标签
功能:用于显示不可编辑的文本或图标,就是界面上‘死’的东西(文字或图片)
# 外部的代码都是重复的省略
label = tkinter.Label(root, text = '这是一个标签') # 摆放文字 各种通用属性都可以用.但是一样用的少.
Button 按钮
功能:点击时执行一个动作
案例:
import tkinter
root = tkinter.Tk()
root.geometry('300x300') # 设置界面大小,用几何字符串设置
btn1 = tkinter.Button(root,)
# root: 表示放的父组件未知子
# bg: 背景色
# text: 文本内容
# fg: 前景色
# font: 字体 (元祖方式 看上面)
# command: 单击按钮时要调用的函数或方法.
# width 和 height 是使用4字符大小,不推荐用
# justify: 设置多行文本的对其方式.left right 等
# state: 状态,按钮能不能点! 用于控制!(active, disabled, normal)
# bd: 边框粗细.单位像素
# 其他去文档里查
btn1.pack()
Entry 单行文本输入框
# 外部的代码都是重复的省略
username = tkinter.Entry(root)
username.pack()
# 默认20个字符
# 可以自定义 用width属性设置,注意单位是字符.
# 通用设置都是一样的
# 如果用密码要掩码的话这样写
password = tkinter.Entry(root, show = '*')
# show属性用来显示你输入的内容.做安全用
# Entry 可以用state状态 控制是否可以输入,或者展示用.'disabled'表示关闭
password.pack()
功能:显示一行文本,可以输入的单行文本
Text 多行文本
功能:显示多行文本,可以输入的多行文本
Checkbutton 复选框
功能:选择框,允许用户选择或不选择一个选项
import tkinter
root = tkinter.Tk()
root.geometry('500x500')
checkbutton = tkinter.Checkbutton(root,text = '要显示的文本') # text 文字是固定的可以这么写
checkbutton.pack()
# 如果字要改变
# 设置显示内容tkinter变量
text = tkinter.StringVar() # 创建变量
text.set('同意此价格') # 设置变量(设置用set,如果想要获取用get)
result = tkinter.Intvar()
checkbutton = tkinter.Checkbutton(root,textvariable = text, variable = result, command = func)
checkbutton.pack()
# vaiable默认是整形,设置复选框勾选与否的值.
# 设置操作checkbutton的方法(也就是勾选后会出发的行为.)
def func():
print(result.get)
# 如果要自定义勾选或者不勾选的值 可以加`onvalue`和`offalue`也就是说得勾选和勾选的值
result = tkinter.Intvar()
checkbutton.pack()
root.mainloop()
Radiobuution 单选框
功能:允许用户从多个选项中选取一个,就是很多选项只能选择一个(小圆点)。
Canvas 画布
功能:提供绘图功能,(直线,椭圆,多边形,矩形)可以包含图形或位图。
import tkinter
root = tkinter.Tk()
root.geometry('500x500')
canvas = tkinter.Canvas(root, bg = 'white') #新建一个画布,把它放入主窗口中,并设置背景为白色.
canvas.pack()
# 在画布中绘制一个长方形,用矩形工具
canvas.create_rectangle(20, 20, 100, 100, fill = 'red', outline = 'yellow')
# 前面数字参数中,前d两个参数表示开始矩形左上角点的位置(横轴,纵轴),后面两个参数表示矩形右下角的距离0轴(初始位置的)距离.
# fill 给画出的模块填充颜色
# outline 边框颜色
root.mainloop()
Listbox 列表框(盒子)
功能:一个选项列表,用户可以从中选择。同时展示多个数据.
# 外部的代码都是重复的省略
# 设置listbox的内容
names = ('吕洋', '任真', '吕恒一')
# 将上面数据转换为tkinter的字符串变量.
students = tkinter.StringVar(value = names)
listbox = tkinter.Listbox(root, listvariable = students)
listbox.pack()
Menu 菜单
功能:点下菜单按钮后弹出一个选项列表,用户可以从中选择。
# 1. 创建主菜单
bigmenu = tkinter.Menu(root)
# 2. 创建子菜单
filemenu = tkinter.Menu(bigmenu, , tearoff = 0))
# tearoff = 0 关闭菜单飘出来的功能
# 子菜单可以添加功能
filemenu.add_commadn(label = '打开文件', command = 一个函数)
filemenu.add_separator() # 在菜单中加入恒线的功能.
# 3. 将子菜单加入主菜单
bigmenu.add_cascade(label = '文件', menu = filemenu)
# 4. 将主菜单加入界面
root.config(menu) # 在主菜单里配置一个主菜单
Menubutton 菜单按钮
功能:用来包含菜单的组件(有下拉式,叠层式等等。)按钮点击弹出菜单栏.
# 重复的主窗口内容略
menbutton = tkinter.Menubutton(root, text = '选择内容')
menubutton.pack()
# 先建立一个菜单
menu = tkinter.Menu(menubuttion)
# 添加选项
# 设置变量
sex = tkinter.StringVar()
men.add_radiobutton(label = '男', variable = sex)
men.add_radiobutton(label = '男', variable = sex)
# 将菜单配置到组件
menubutton.config(menu = menu)
OptionMenu 设置菜单
功能:类似下拉列表的效果
# 重复框架内容略
# 创建一个变量用来接收结果
restult = tkinter.StringVar()
result.set('请选择一个问题') # 设置默认显示的值
optionmenu - tkinter.OptionMenu(root, restult, '这是一个问题', '这是二个问题', '这是很多问题.')
Message 消息框
功能:类似于标签,单是可以显示多行文本
Scale 进度条
功能:线性"滑块"组件,可设定起始值和结束值,会显示当前位置的精确值.
Scrollbar 滚动条
功能:对其支持的组件(文本域,画布,列表框,文本框)提供滚动功能.
Toplevel 顶层组件
功能:类似框架为其他空间提供但单独的容器.比如点设置新弹出来一个设置界面 就用到这个.
Spinbox 输入空间
功能:与Entry类似,但是可以指定输入范围值.只能输入指定类型的内容.(数字,小数,文本之类的.)
PanedWindow 窗口布局管理
功能:是一个窗口布局管理的插件,可以包含一个或者多个子控件.
LabelFrame 容器控件
功能:是一个简单的容器控件.常用用于复杂窗口布局,例如设置界面内容太多可以把相关内容的设置装在一起.然后写上说明.
# 外部的代码都是重复的省略
labelframe = tkinter.LabelFrame(root, text = '常规设置')
labelframe.pack()
# pack内可以用ipadx设置大小
# 也是虚拟框架 要把组件放进去才显示.
btn1 = tkinter.Button(labelframe, text = '按钮1')
btn1.pack()
btn2 = tkinter.Button(labelframe, text = '按钮1')
btn2.pack()
messagebox 消息框
功能:用于显示你应用程序的消息框.消息框有很多种(消息选择框,文件存储框等),可以以后用的时候慢慢查询.