目录
介绍
Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。
Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。
由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinter 还是能应付自如。
注意:Python3.x 版本使用的库名为 tkinter,即首写字母 T 为小写。
模块
导入方式
import tkinter
验证模块是否已安装
终端中运行命令:python -m tkinter
,运行后界面会弹出一个 tk 小窗口,表示安装成功,而且告诉你 Tcl/Tk 的版本号,通过这个版本号,你就可以参考对应的 Tcl/Tk 文档了。
API 使用
主窗口
创建 GUI 界面,作为根窗口:
# 创建主窗口
root = tk.Tk()
root.title("tk Root") # 设置窗口名称
root.geometry('200x200') # 设置窗口大小
运行窗口
# 运行
root.mainloop()
组件列表介绍
类 | 名称 | 简介 |
---|---|---|
Toplevel | 顶层 | 容器类,为其他组件提供单独容器 |
Button | 按钮 | 按钮组件 |
Canvas | 画布 | 提供绘图功能,包括:直线,矩形,椭圆,多边形,位图等 |
Checkbutton | 复选框 | 可选的复选框 |
Entry | 单行输入框 | 可输入内容 |
Frame | 容器 | 装载其它GUI组件 |
Label | 标签 | 显示不可编辑的文本或图标 |
LabelFrame | 容器 | 容器组件,类似Frame支持添加标题 |
Listbox | 列表框 | 列出多个选项,供选择 |
Menu | 菜单 | 菜单组件 |
Menubutton | 菜单按钮 | 包含菜单的按钮(下拉式,层叠式) |
OptionMeny | 菜单按钮 | Menubutton的子类,可通过按钮打开一个菜单 |
Message | 消息框 | 类似标签,但可以显示多行文本 |
PanedWindow | 分区窗口 | 该容器会被划分成多个区域,每添加一个组件占一个区域,用户可以拖动分割线改变各区域大小 |
Radiobutton | 单选钮 | 供用户点边的单选妞 |
Scale | 滑动条 | 拖动滑动块可设定起始值和结束值,可显示当前位置的精确值 |
Spinbox | 微调选择器 | 可通过该组件的向上、向下箭头选择不同的值 |
Scrollbar | 滚动条 | 为组件提供滚动功能 |
Text | 多行文本框 | 显示多行文本 |
Label 标签
属性说明:
width, height=宽高 font(name,size)=字体 image=图像(只支持GIF格式)
fg(foreground)=前景色 bg(background)=背景色 justify(left|center|right)=对齐方式
# 设置 label 属性
L = tk.Label(root, # 窗口
text='展示标签!', # 描述
bg='green', # 背景
borderwidth=5, # 边界宽度
relief="solid", # 指定组件 3D 效果
justify="right", # 字体对齐方式
font=('微软雅黑', 12), # 字体
width=15, height=2) # 宽高
# 放置 label 控件在窗口中的位置
L.pack(side='right') # 上top下bottom 左left右right
# 配置GIF图片方式
gifpath = r"D:\xxx\www.gif"
photo = tk.PhotoImage(file=gifpath) # 实例化图片对象
lab = tk.Label(image=photo) # 设置图片标签
lab.pack()
Button 按钮
# 定义空字符串变量,用于标签属性中接收数据
var = tk.StringVar()
# 设置 label 标签属性
L = tk.Label(root, # 窗口
# text='展示标签!', # 描述
textvariable=var, # 接收外部传参
bg='green', # 背景
font=('微软雅黑', 12), # 字体
width=15, height=2) # 宽高
# 放置 label 位置
L.pack() # 上下 左left右right
on_func = False # 定义一个开关
# 按钮事件
def func():
global on_func
if on_func:
on_func = False
var.set('')
else:
on_func = True
var.set('要显示内容')
# 设置 button 按钮属性
B = tk.Button(root, text='按钮', width=15, height=2,
command=func) # 设置按钮事件,函数
B.pack()
Options 属性选项
组件中的属性,可以通过 Options 设置组件对应的属性,从而控制组件的各种状态。比如:宽度、高度、背景色等等。
有三种方式设置 Options 选项,在各种 GUI 组件中用法都一致。
- 创建对象时,使用命名参数(也叫关键字参数):
fred = Button(width=15, height=2, bg="blue")
- 创建对象后,使用字典索引方式:
fred['fg'] = "red"
fred['bg'] = "blue"
- 创建对象后,使用
config()
方式:
fred.config(width=15, height=2, bg="blue")
- 属性选项列表:
属性名 | 简介 |
---|---|
activebackground | 指定组件处于激活状态时的背景色 |
activeforeground | 指定组件处于激活状态时的前景色 |
disabledforeground | 指定组件处于禁用状态时的前景色 |
anchor | 指定组件内的字符在组件中显示位置,选项值(N,NE,E,SE,S,SW,W,NW,CENTER) |
background | 组件正常的背景色(bg) |
foreground | 组件正常的前景色(fg) |
bitmap | 指定在组件上显示该选项指定的位图,位图的显示方式受anchor、justify影响。如果同时指定bitmap和text,那么bitmap覆盖文本;如果同时指定bitmap和image,那么image覆盖bitmap。 |
relief | 组件的3D效果,支持: raised(凸起),sunken(凹陷),flat(平坦),ridge(隆起),solid(实心),groove(凹槽) |
borderwidth | 指定组件正常显示的3D边框宽度 |
cursor | 指定光标在组件上的样式 |
command | 指定组件关联的命令方法。该方法在组件离开组件时触发 |
font | 组件上显示的文字字体 |
highlightbackground | 指定组件在高亮状态下的背景色 |
highlightcolor | 指定组件在高亮状态下的前景色 |
highlightthickness | 指定组件在高亮状态下的周围方形区域的宽度 |
state | 组件的当前状态,支持:NORMAL(正常),DISABLE(禁用) |
height | 组件的高度 |
width | 组件的宽度 |
wraplength | 对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过设定自动换行 |
image | 组件中显示的图片 |
justify | 组件内部内容对齐方式,支持(小写):LEFT(左对齐),CENTER(居中),RIGHT(右对齐) |
padx | 组件内部在水平方向上两边的空白 |
pady | 组件内部在垂直方向上两边的空白 |
takefocus | 指定组件在键盘遍历(Tab或Shift+Tab)时是否接收焦点,将选项设为1:接收焦点;设为0:不接受焦点 |
text | 组件显示的文本 |
textvariable | 指定一个变量名,组件负责显示该变量值转换得到的字符串 |
underline | 指定组件文本的第几个字符添加下划线,该选项相当于为组件绑定了快捷键 |
xscrollcommand | 通常用于将组件的水平滚动改变与水平滚动条的 set 方法关联,从而让组件的水平滚动改变传递到水平滚动条 |
yscrollcommand | 通常用于将组件的垂直滚动改变与垂直滚动条的 set 方法关联,从而让组件的垂直滚动改变传递到垂直滚动条 |
文本框
Entry 单行文本框
Entry 用来接收一行字符串的控件,如果用户输入的内容长度超过 Entry 控件的宽度时,文字会自动换行。
简单示例:
def login():
print('名称:'+entry1.get()) # 接收文本框的内容
labe = tk.Label(root, text="名称:")
labe.pack()
v1 = tk.StringVar() # 设置空字符串变量,属性value='可设置默认值'
# 单行文本框
# show属性可将输入的内容转为指定字符方式显示,比如输入密码
entry1 = tk.Entry(root, textvariable=v1, show='*')
entry1.pack()
v1.set('设置初始值...') # 方式二:单独设置默认值
tk.Button(root, text='发送文本中内容', command=login).pack()
Text 多行文本框
主要用来显示多行文本,还可以显示网页链接、图片、HTML、CSS样式表、添加组件等等。
wrap=换行方式,word:单词换行
undo,True:开启撤销功能, False:不开启
示例:
''' Text 多行文本框 '''
tk.Label(root, text='文本框:', width=30).pack(anchor='w')
# 创建多行文本
tex = tk.Text(root, width=40, height=12)
tex.pack()
- insert(index, ‘str’) 插入属性
index:位置,可数字表示(行从1起,列从0起),或INSERT(开始)、END(结尾)
str:需要插入的内容
规则:不包头,包尾
tex.insert('insert', 'ABCD\nEFG') # 在第一行第0列位置插入内容
tex.insert(2.2, '12345') # 在第二行第3列位置插入内容
'''结果:
ABCD
EF12345G
'''
- get(insert, end) 获取内容属性
insert:起始位置,int类型,用1.0表示(行从1起,列从0起);
end:结尾,str类型或 int类型,用1.0表示(行从1起,列从0起);
tex.get(3.2, 3.7) # 指定范围内
tex.get(3.2, 'end') # 指定起始位置至结尾
- 在文本框中放入图片:
gifpath1 = r"D:\xxxx\www.gif"
photo1 = tk.PhotoImage(file=gifpath1)
tex.image_create('end', image=photo1) # 在结尾放入图片
文本框属性:
background, bd, bg, borderwidth, cursor,exportselection, fg, font, foreground, ighlightbackground,
highlightcolor, highlightthickness, insertbackground,insertborderwidth, insertofftime, insertontime,
insertwidth,invalidcommand, invcmd, justify, relief, selectbackground,selectborderwidth,
electforeground, show, state, takefocus,textvariable, validate, validatecommand, vcmd, width,xscrollcommand
选择框
Radiobutton 单选框
value: 定义单选按钮返回的内容
''' 单选按钮 '''
def confirm():
messagebox.showinfo('测试', '选择的内容:' + var.get())
var = tk.StringVar()
var.set("J")
tk.Label(root, text='单选: ', width=10).pack(anchor='w')
radio1 = tk.Radiobutton(root, text='Python', value='P', variable=var)
radio2 = tk.Radiobutton(root, text='Java', value='J', variable=var)
radio1.pack(anchor='w'); radio2.pack(anchor='w')
tk.Button(root, text='确认', command=confirm).pack()
Checkbutton 多选框
onvalue=1 # 1 表示默认选状态,0 表示不选
offvalue=0 # 未选择的返回值
def check():
if code.get() == 1 and vide.get() == 1:
messagebox.showinfo('多选', '选择:python, java')
elif vide.get() == 1:
messagebox.showinfo('多选', '选择:java')
elif code.get() == 1:
messagebox.showinfo('多选', '选择:python')
else:
messagebox.showinfo('多选', '都没选择!')
tk.Label(root, text='多选:', width=10).pack(anchor='w')
code = tk.IntVar(); vide = tk.IntVar() # 接收int类型参数
check1 = tk.Checkbutton(root, text='python', onvalue=1, offvalue=0, variable=code)
check2 = tk.Checkbutton(root, text='Java', onvalue=1, offvalue=0, variable=vide)
check1.pack(anchor='w'); check2.pack(anchor='w')
tk.Button(root, text='多选确认', command=check).pack()
选择框属性:
activebackground, activeforeground, anchor,background, bd, bg, bitmap, borderwidth,
command, cursor,disabledforeground, fg, font, foreground, height,highlightbackground,
highlightcolor, highlightthickness, image,indicatoron, justify, offvalue, onvalue, padx, pady,
relief,selectcolor, selectimage, state, takefocus, text, textvariable,underline, variable, width, wraplength
通用消息弹窗
messagebox 消息弹框
Messagebox 用于显示弹出消息。Messagebox主要提供了7种消息提示,如:showinfo()、showerror()、showwarning()、askquestion()、askokcancel()、askyesno()、askretyrcancel()。
导入方式:
from tkinter import messagebox
消息对话框函数列表:
返回值:选择项
函数 | 说明 |
---|---|
showinfo(title, message, **options) | 消息提示框 |
showerror(title, message, **options) | 错误提示框 |
showwarning(title, message, **options) | 警告提示框 |
askquestion(title, message, **options) | 疑问提示框 |
askokcancel(title, message, **options) | 确定/取消 |
askyesno(title, message, **options) | yes/No |
askretrycancel(title, message, **options) | 重试/取消 |
简单示例:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("TK title")
root.geometry("500x1000+100+200")
def msg1():
messagebox.showinfo('information', 'Hi! You got a prompt.')
messagebox.showerror('error', 'Something went wrong!')
messagebox.showwarning('warning', 'accept T&C')
messagebox.askquestion('Ask Question', 'Do you want to continue?')
messagebox.askokcancel('Ok Cancel', 'Are You sure?')
messagebox.askyesno('Yes|No', 'Do you want to proceed?')
messagebox.askretrycancel('retry', 'Failed! want to try again?')
tk.Button(root, text='Click Me', command=msg1).pack(pady=50)
canvas 画布
canvas 画布是一个矩形区域,可以放置图形、图像、组件等等。
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
# 代表父类的定义,不是父类对象
super().__init__(master)
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
self.canvas = tk.Canvas(self, width=300, height=200, bg='green')
self.canvas.pack()
# 画一条直线
self.canvas.create_line(10,10,30,20,40,50)
# 画一个矩形
self.canvas.create_rectangle(50,50,100,100)
# 画一个圆
self.canvas.create_oval(50,50,100,100)
# 加图片
path = "D:\wangxin_m\selenium_py36\gui_tkinter\www.gif"
global photo
photo = tk.PhotoImage(file=path)
self.canvas.create_image(110,300, image=photo)
if __name__ == '__main__':
root = tk.Tk()
root.title('画布练习')
root.geometry('500x200+200+200')
app = Application(master=root)
root.mainloop()
布局管理
一个 GUI 应用程序必然有大量的组件,tkinter提供了布局管理器帮助我们组织、管理在父组件中子组件的布局方式。提供了三种管理器:pack、grid、place。
grid 表格布局
采用表格结构组织组件;子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。
grid()方法提供的选项:
选项 | 说明 |
---|---|
column | 单元格的列号(从0开始) |
columnspan | 跨列 |
row | 单元格的行号(从0开始) |
rowspan | 跨行 |
ipadx,ipady | 设置子组件之间的间隔 |
padx,pady | 并列的组件之间的间隔 |
sticky | 组件紧贴所在单元格的某一角,对应对应东南西北及4个角 |
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
# 代表父类的定义,不是父类对象
super().__init__(master)
self.master = master
self.pack()
self.gridWidget()
def gridWidget(self):
self.labY = tk.Label(self, text='用户名')
self.labP = tk.Label(self, text='iPhone')
self.enrY = tk.Entry(self)
self.enrP = tk.Entry(self)
# 设置控件位置
self.labY.grid(row=0, column=0) # row=0, column=0 表示:第1行第1列位置
self.enrY.grid(row=0, column=1)
self.labP.grid(row=1, column=0)
self.enrP.grid(row=1, column=1)
tk.Button(self, text='登录').grid(row=2, column=0, sticky='w')
tk.Button(self, text='取消').grid(row=2, column=1, sticky='e')
# 跨行,多行文本框
self.text = tk.Text(self, width=28, height=3)
self.text.grid(row=3, column=0, columnspan=2)
if __name__ == '__main__':
root = tk.Tk()
root.title('画布练习')
app = Application(master=root)
root.mainloop()
计算器布局示例:
class Application(tk.Frame):
def __init__(self, master=None):
# 代表父类的定义,不是父类对象
super().__init__(master)
self.master = master