python的tkinter库的运用
GUI和tkinter
GUI英文全称是 Graphical User Interface,中文为**图形用户接口**。
早期人与计算机之间的沟通是文字形式的沟通,例如,早期的DOS操作系统、
Windows 的命令提示符窗口、Linux系统,等等。
Tkinter 是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口。
创建一个窗口
from tkinter import *
root = Tk() # 创建tkinter窗口,(初始化tkinter.Tk类)
root.title('Tk窗口') # 设置窗口标题
root.geometry("400x200") # 设置窗口大小(宽、高,大小为像素)
root.mainloop()
# mainloop()方法可以让程序继续执行,同时进入等待与处理窗口事件。
窗口的属性
组件的位置设置
place方法
place(...options...)
x/y 把父容器看成一个坐标轴 单位为像素 (0,0)为左上角
width/height 设置标签的宽和高 单位像素
relx/rely 相对于父容器的位置 值为0.0-1.0
relwidth/relheight 对于父容器的相对大小
pack 方法
pack(...options...)
side 多标签位置关系 (TOP 由上往下排 ,BOTTOM 下上 LEFT左右RIGHT 右左)
padx/pady 组件与组件 组件与容器边界的距离
ipadx/ipady 文字与标签边界的距离
anchor 标签在容器中的位置n 北 s 南 w 西 e 东)
fill 填充标签所分配区间的方式 (X 轴, Y 轴, BOTH 填满所分配的空(x,y) , NONE 默认值 原大小)当标签上下排列时分配空间为X轴,左右排列时分配的空间是Y轴
expand 是否填满额外父容器空间 True(1) 是 False 否(0)
grid 方法
以网格方法设置组件位置
grid(...options...)
row/column 标签的排放方式row 行 column 列 (row=0,column=0 第一行第一列)
columnspan 列方向合并标签
rowspan 行方向合并标签
padx/pady 组件与组件 组件与容器边界的距离
sticky 类似与anchor只能设定(N/S/W/E 上/下/左/右)
注可以组合使用N+S 可以拉长高度,让上下对齐
Label组件
Label组件,标签控件,可以显示文本和图片。
Label组件的属性
Lable(父对象,options...) 标签
text 标签的文本内容
fg 文字颜色
bg 标签背景颜色
font(字体,字号,粗细...) 字体
image 图片 image=图片 图片=PhotoImage(file=‘图片路径+名称’)
compound 图文关系(LEFT 图片在文字左边 RIGTH 右 TOP 上 BOTTOM 下 CENTER 文字在覆盖在图片上)
width 标签的宽度
height 标签的高度
justify 存在多行文字时最后一行文字的对齐方式(left,rigth,center)
padx/pady 文字与标签的距离
anchor 文字在标签中的位置(n 北 s 南 w 西 e 东)
wraplength 文字到多少宽度换行
bitmap 内建位图
config 改变原标签定义的内容 标签.config(options)
注:Label()方法的第一个参数是父对象,表示这个标签将建立在哪一个父对象(可想成父窗口或称容器)内。
Label组件显示文字
from tkinter import *
root = Tk()
root.title('文字')
root.geometry("400x200")
root.resizable(0,0)
label = Label(root,text='Label组件显示文字',bg='red',font=('华文彩云', 12)) # text:标签的文本内容,bg:标签背景颜色,font:(字体,字号,粗细...) 字体
label.place(x=10,y=20,width=150,height=50)
root.mainloop()
Label组件显示图片
from tkinter import *
root = Tk()
root.title('文字')
root.geometry("400x200")
root.resizable(0,0)
img = PhotoImage(file='./图片/02.png')
label = Label(root,image=img,bg='red',) # image:图片,bg:标签背景颜色
label.image = img
label.place(x=10,y=10,width=105,height=105)
root.mainloop()
Button组件
Button组件,按钮控件;在程序中显示按钮。
Button组件的属性
Button(父对象,...options...)
bd 边界宽度 默认2
bg 背景颜色
fg 字体颜色
command 单击按钮时执行此方法
compound 图片和文字同时显示
font(字体,字号,粗细...) 字体设置
image 功能按钮上的图片
justify 当有多行文字时最后一行文字的对齐方式(left、center、right)
padx/pady 功能键边界与文字的距离 默认1
text 功能键名称
Button实例
from tkinter import *
def test():
lable = Label(root,text='Button键调用的函数',font=('华文彩云', 12),fg='blue',bg='yellow')
lable.place(x=5,y=5,width=150,height=50)
root = Tk()
root.title('')
root.geometry("400x200")
root.resizable(0,0)
img = PhotoImage(file='./图片/按钮背景图片.png')
button1 = Button(root,text='打印',image=img,compound=CENTER,font=('华文彩云', 12),command=test)
button1.image = img
button1.place(x=10,y=130,width=100,height=50)
button2 = Button(root,text='退出',image=img,compound=CENTER,font=('华文彩云', 12),command=root.quit)
button2.place(x=120,y=130,width=100,height=50)
root.mainloop()
Entry组件
Entry组件,输入控件;用于显示简单的文本内容
Entry组件的属性
Entry(父对象,...options...)
bg 背景颜色
fg 文字颜色
font 字体的设置
command 当更改内容时会执行此函数
sursor 当鼠标在复选框上时光标的形状
width/height 宽和高
justify 当有多行文字时最后一行的对齐方式
show 显示输入字符,列show='*'时表示显示星号,常用于输入密码字段
xscrollcommand 在x轴使用滚动条
Entry实例
from tkinter import *
root = Tk()
root.title('Entry')
root.geometry("400x200")
root.resizable(0,0)
entry = Entry(root,fg='red',) # fg:文字颜色
entry.place(x=10,y=10,width=105,height=30)
root.mainloop()
类别变量
类别变量的基本概念
有些组件在执行时会更改内容,例如,文本框(Entry)、选项按钮(Radiobutton)
等。有些控件我们可以更改它们的内容,例如,标签(Label)等。如果想要更改它们
的内容可以使用这些控件的参数,例如,textvariable、variable 等。
不过要将组件的参数以变量方式处理时,需要借助tkinter模块内的变量类别
(Variable Classes),这个类别有4个子类别,每一个类别其实是一个数据类型的
构造方法,我们可以通过这4个子类别的数据类型将它们与组件的相关参数结合。
类别变量的类型
Tntvar 整型变量,默认是0
Doublevar 浮点型变量,默认是0.0
Stringvar 字符串变量,默认是''
Booleanvar 布尔型变量,True是1,False是0
trace追踪
w模式:与输入类组件合用
trace("w",test)
变量设置后,我们可以利用变量设置追踪Widget控件,当其内容更改时,让程序执行test函数。
r模式:与提交类组件合用
trace("r",test)
当控件内容被读取时,执行追踪并执行特定函数。
get和set
使用get()方法取得变量内容
使用set()方法设置变量内容
实例
from tkinter import *
def test(*args):
var2.set(var1.get())
# var1.get():取得var1变量内容
# var2.set():设置var2变量内容
root = Tk()
root.title('类别变量')
root.geometry("230x100")
root.resizable(0,0)
var1 = StringVar() # 设置类别变量
entry = Entry(root,textvariable=var1) # textvariable:以变量的方式显示输入框的文字
entry.place(x=10,y=10,width=210,height=30)
var1.trace('w',test) # 以w模式追踪var1类别变量,并且执行test函数
var2 = StringVar() # 设置类别变量
var2.set('同步显示') # 设置变量内容
label = Label(root,textvariable=var2) # # textvariable:以变量的方式显示标签的文字
label.place(x=10,y=40,width=210,height=30)
root.mainloop()
Radiobutton组件
Radiobutton组件,单选按钮控件,显示一个单选的按钮状态(类容)
Radiobutton组件的属性
Radiobutton(父对象,...options...)
anchor 控制选项按钮的位置
bg 背景颜色
fg 文字颜色
font 字体的设置
command 当更改内容时会执行此函数
sursor 当鼠标在复选框上时光标的形状
height 选项按钮上的文字有几行
width 选项按钮有几个字符宽
warplength 限制每行文字数量
justify 当有多行文字时最后一行的对齐方式
text 选项按钮旁的文字
image 简历含图像的选项按钮
indicatoron 当值为0时,建立盒子选项按钮
padx 选项按钮与文字的间隔,默认1
pady 选项按钮之间的间隔,默认1
selecimage
state 默认是NORMAL,若设置为DISABLE则以灰阶显示按钮表示按钮暂时无法使用
textvariable 以变量的方式显示按钮旁的文字
variable 设置当前按钮的值的类型(Intvar()...
value 选择按钮的值,可以区分按钮
selectcolor 选择按钮被选择时的颜色
Radiobutton实例
from tkinter import *
def test():
label2.config(text='你的学历是:'+dic[var.get()])
# config更改Label组件的
root = Tk()
root.title('Radiobutton')
root.geometry("200x240")
root.resizable(0,0)
label1 = Label(root,text='请选择你的学历',font=('华文彩云', 12),fg='red')
label1.pack()
label2 = Label(root,text='',font=('黑体', 12),fg='blue')
label2.pack()
var = IntVar()
dic = {1:'小学',2:'中学',3:'高中',4:'大学',5:'研究生',6:'博士'}
for k,v in dic.items():
radiobutton = Radiobutton(root,text=v,value=k,variable=var,command=test,fg='red',) # value:选择按钮的值,可以区分按钮;text:选项按钮旁的文字;variable:设置当前按钮的值的类型(Intvar()...
radiobutton.pack()
root.mainloop()
Checkbutton组件
Checkbutton组件,多选框控件,用于在程序中提供多项选择框。
Checkbutton组件的属性
Checkbutton(父对象,...options...)
anchor 控制选项按钮的位置
bg 背景颜色
fg 文字颜色
font 字体的设置
command 当更改内容时会执行此函数
sursor 当鼠标在复选框上时光标的形状
height 选项按钮上的文字有几行
width 选项按钮有几个字符宽
warplength 限制每行文字数量
justify 当有多行文字时最后一行的对齐方式
text 选项按钮旁的文字
image 简历含图像的选项按钮
indicatoron 当值为0时,建立盒子选项按钮
padx 选项按钮与文字的间隔,默认1
pady 选项按钮之间的间隔,默认1
state 默认是NORMAL,若设置为DISABLE则以灰阶显示按钮表示按钮暂时无法使用
textvariable 以变量的方式显示按钮旁的文字
variable 设置当前按钮的值的类型(Intvar()...
value 选择按钮的值,可以区分按钮
selectcolor 选择按钮被选择时的颜色
Checkbutton实例
from tkinter import *
def test():
s = ''
for i in checkbool:
if checkbool[i].get() == True:
s += dic[i] + ','
label2.config(text=s)
root = Tk()
root.title('Radiobutton')
root.geometry("200x240")
root.resizable(0,0)
label1 = Label(root,text='选择你喜欢的运动',font=('华文彩云', 12),fg='red')
label1.pack()
label2 = Label(root,text='',fg='blue')
label2.pack()
dic = {1:'棒球',2:'篮球',3:'足球',4:'网球',5:'乒乓球'}
checkbool = {}
for i in range(1,len(dic)+1):
checkbool[i] = BooleanVar()
checkbutton = Checkbutton(root,text=dic[i],variable=checkbool[i])
checkbutton.pack()
button = Button(root,text='确 定',width=15,command=test)
button.pack()
root.mainloop()
Frame组件
Frame组件,框架控件,在屏幕上显示一个矩形区域,多用来作为容器。
Frame组件的属性
Frame(复对象,...options...)
bg 背景色彩
bd 边界宽度
height 框架的高度,单位像素
width 框架的宽度
relief 控制外框架
Frame实例
from tkinter import *
root = Tk()
root.title('Frame')
root.geometry("400x400")
root.resizable(0,0)
frame1 = Frame(root,width=200,height=200,bg='red')
frame1.place(x=0,y=0)
frame2 = Frame(root,width=200,height=200,bg='blue')
frame2.place(x=200,y=200)
label1 = Label(frame1,text='在Frame内创建标签1',font=('华文彩云', 12),fg='red') # 在Frame创建组件
label1.place(x=2,y=2,width=180,height=50)
label2 = Label(frame1,text='在Frame内创建标签2',font=('华文彩云', 12),fg='blue') # 在Frame创建组件
label2.place(x=2,y=148,width=180,height=50)
img = PhotoImage(file='./图片/02.png')
label3 = Label(frame2,image=img) # 在Frame创建组件
label3.place(x=50,y=50,width=105,height=105)
root.mainloop()
LabelFrame组件
LabelFrame组件,labelframe 是一个简单的容器控件。常用与复杂的窗口布局。并且可以去一个名字
LabelFrame组件的属性
LabelFrame(复对象,...options...)
bg 背景色彩
bd 边界宽度
height 框架的高度,单位像素
width 框架的宽度
relief 控制外框架
text 标签文本内容
LabelFrame实例
from tkinter import *
root = Tk()
root.title('LabelFrame')
root.geometry("400x400")
root.resizable(0,0)
labelframe1 = LabelFrame(root,text='登录',width=300,height=200)
labelframe1.place(x=50,y=50)
label1 = Label(labelframe1,text='user:',font=('黑体', 12)) # 在LabelFrame创建组件
label1.place(x=5,y=30,width=50,height=15)
label2 = Label(labelframe1,text='passwd:',font=('黑体', 12)) # 在LabelFrame创建组件
label2.place(x=5,y=80,width=50,height=15)
entry1 = Entry(labelframe1,fg='blue') # 在LabelFrame创建组件
entry1.place(x=60,y=30,width=150,height=20)
entry2 = Entry(labelframe1,fg='blue',show='*') # 在LabelFrame创建组件
entry2.place(x=60,y=80,width=150,height=20)
root.mainloop()
Toplevel组件
控件的功能类似于Frame,但是这个控件所产生的容器是一个独立的窗口,有自己的标题栏和边框。
注:更Tk创建窗口的属性一样。
from tkinter import *
def test():
toplevel = Toplevel()
toplevel.title('Toplevel')
toplevel.geometry("200x200")
label = Label(toplevel,text='Toplevel窗口',font=('华文彩云',15),fg='blue')
label.place(x=20,y=80,width=150,height=20)
toplevel.mainloop()
root = Tk()
root.title('Toplevel')
root.geometry("200x200")
root.resizable(0,0)
button = Button(root,text='打开Toplevel窗口',font=('华文彩云',15),fg='red',command=test)
button.place(x=10,y=50,width=180,height=50)
root.mainloop()