第一章 初识Tkinter
目录
前言
在当今数字化的时代,图形用户界面(GUI)已经成为软件不可或缺的一部分。无论是日常使用的办公软件、娱乐应用,还是专业的开发工具,GUI 都为用户提供了直观、便捷的交互方式。对于 Python 开发者来说,Tkinter 是一个理想的入门选择,它是 Python 的标准 GUI 库,无需额外安装,简单易用,却又功能强大。
本学习笔记旨在帮助初学者系统地掌握 Tkinter 的基础知识和应用技巧。通过详细的讲解和丰富的案例,你将学会如何创建窗口、添加各种界面元素、管理布局、处理用户事件,以及开发完整的 GUI 应用程序。从简单的 "Hello World" 程序到复杂的文件浏览器,每一个案例都经过精心设计,由浅入深,逐步引导你掌握 Tkinter 的核心概念和技术。
特别值得一提的是,每个小节都配有代码示例,这些示例不仅注解清晰,易于理解,还具有很强的实用性。你可以直接运行这些代码,观察效果,也可以在此基础上进行修改和扩展,快速实现自己的想法。通过这种实践性的学习方式,你将更加高效地掌握 Tkinter 编程技能。
无论你是 Python 编程的新手,还是有一定经验的开发者,希望通过本学习笔记,你能够轻松入门 Tkinter,开发出美观、实用的 GUI 应用程序。让我们一起开启这段有趣的编程之旅吧!
一、Tkinter 是什么?
Tkinter 是 Python 的标准 GUI(图形用户界面)库,它提供了创建窗口、按钮、文本框等各种界面元素的功能。使用 Tkinter 可以快速开发跨平台的桌面应用程序,无需额外安装其他库。
二、学习内容
1. 第一个 Tkinter 程序
代码如下(示例):
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("第一个Tkinter程序") # 设置窗口标题
root.geometry("300x200") # 设置窗口大小,格式为宽度x高度
# 创建标签
label = tk.Label(root, text="欢迎使用Tkinter!", font=("Arial", 12))
label.pack(pady=20) # 将标签放置在窗口中,并设置垂直间距
# 创建按钮
button = tk.Button(root, text="点击我", command=lambda: print("按钮被点击了!"))
button.pack(pady=10) # 将按钮放置在窗口中,并设置垂直间距
# 进入主事件循环
root.mainloop()
2 程序说明
这个程序展示了 Tkinter 的基本结构:
- 导入 tkinter 模块
- 创建主窗口(
tk.Tk()
)- 添加界面元素(标签、按钮等)
- 使用布局管理器(如
pack()
)将元素放置在窗口中- 进入主事件循环(
mainloop()
)
二、Tkinter 基本组件
2.1 标签 (Label)
示例1
import tkinter as tk
root = tk.Tk()
root.title("Label参数示例")
# 创建一个包含多种参数的标签
label = tk.Label(
root,
text="这是一个多行文本标签\n支持自动换行和对齐",
font=("SimHei", 12),
fg="white",
bg="blue",
width=30,
height=5,
padx=10,
pady=5,
relief=tk.RAISED,
bd=2,
anchor=tk.NW, # 文本左上角对齐
justify=tk.LEFT, # 左对齐
wraplength=200, # 200像素后自动换行
cursor="hand2", # 鼠标悬停时显示手型
activebackground="red", # 鼠标悬停时背景变红
disabledforeground="gray" # 禁用时文本变灰
)
label.pack(pady=20)
# 测试状态变化
def toggle_state():
label.config(state=tk.DISABLED if label["state"] == tk.NORMAL else tk.NORMAL)
tk.Button(root, text="切换状态", command=toggle_state).pack()
root.mainloop()
详细的参数介绍:
基本参数
master
- 说明:父窗口或容器,即该标签所属的窗口或框架。
- 示例:
root = tk.Tk(); label = tk.Label(root)
text
- 说明:显示的文本内容。
- 示例:
text="Hello, Tkinter!"
textvariable
- 说明:关联一个
StringVar
对象,用于动态更新文本。- 示例:
var = tk.StringVar() var.set("动态文本") label = tk.Label(root, textvariable=var)
image
- 说明:显示的图像(需使用
tk.PhotoImage
或PIL.ImageTk.PhotoImage
)。- 示例:
photo = tk.PhotoImage(file="image.png") label = tk.Label(root, image=photo)
compound
- 说明:当同时设置
text
和image
时,指定文本和图像的组合方式。- 可选值:
tk.NONE
(默认,只显示图像)tk.TOP
(文本在图像上方)tk.BOTTOM
(文本在图像下方)tk.LEFT
(文本在图像左侧)tk.RIGHT
(文本在图像右侧)tk.CENTER
(文本覆盖在图像中央)
外观参数
font
- 说明:文本字体,可指定为元组
(字体名称, 大小, 样式)
或字体对象。- 示例:
font=("SimHei", 12, "bold") # 黑体,12号,加粗 font=tk.font.Font(family="Arial", size=10, slant="italic")
fg
(foreground)
- 说明:文本颜色,可使用颜色名称(如
"red"
)或十六进制值(如"#FF0000"
)。
bg
(background)
- 说明:背景颜色。
width
和height
- 说明:标签的宽度和高度。
- 单位:
- 若显示文本,单位为字符(默认)。
- 若显示图像,单位为像素。
- 示例:
width=10, height=2
(10 个字符宽,2 行高)
padx
和pady
- 说明:标签内容与边界的水平 / 垂直间距(内边距),单位为像素。
relief
- 说明:边框样式。
- 可选值:
tk.FLAT
(平的,默认)tk.RAISED
(凸起)tk.SUNKEN
(凹陷)tk.GROOVE
(凹槽)tk.RIDGE
(脊状)
bd
(borderwidth)
- 说明:边框宽度,单位为像素。
highlightbackground
和highlightcolor
- 说明:当标签获得焦点时,焦点边框的背景色和颜色。
highlightthickness
- 说明:焦点边框的厚度。
文本布局参数
anchor
- 说明:文本在标签内的对齐方式(当标签空间大于文本时)。
- 可选值:
tk.N
,tk.NE
,tk.E
,tk.SE
,tk.S
,tk.SW
,tk.W
,tk.NW
,tk.CENTER
(默认)
justify
- 说明:多行文本的对齐方式。
- 可选值:
tk.LEFT
(左对齐)、tk.CENTER
(居中)、tk.RIGHT
(右对齐)。
wraplength
- 说明:文本自动换行的宽度(单位为像素)。
状态参数
state
- 说明:标签的状态。
- 可选值:
tk.NORMAL
(正常)tk.DISABLED
(禁用,文本变灰且不可交互)
cursor
- 说明:鼠标悬停在标签上时的光标样式(如
"hand2"
表示手型)。
事件绑定参数
takefocus
- 说明:是否可以通过 Tab 键聚焦到该标签。
- 默认:
False
(标签通常不参与焦点导航)
其他参数
bitmap
- 说明:显示内置位图(如
"error"
,"hourglass"
等),但已逐渐被image
参数取代。
activebackground
和activeforeground
- 说明:鼠标悬停在标签上时的背景色和文本颜色。
disabledforeground
- 说明:标签禁用时的文本颜色。
示例2
import tkinter as tk
root = tk.Tk()
root.title("标签示例")
root.geometry("300x150")
# 创建一个标签,显示文本
label1 = tk.Label(root, text="普通文本标签", fg="black", bg="white")
label1.pack(pady=10)
# 创建一个带属性的标签
label2 = tk.Label(root,
text="带属性的标签",
font=("SimHei", 14), # 设置字体和大小
fg="white", # 前景色(文本颜色)
bg="blue", # 背景色
width=20, # 宽度
height=2) # 高度
label2.pack(pady=10)
root.mainloop()
代码解释
这段代码创建了两个标签:
普通文本标签:
- 使用默认字体和样式
- 前景色为黑色,背景色为白色
- 通过
pack(pady=10)
设置了垂直间距
带属性的标签:
- 指定了字体为 "SimHei"(黑体),大小为 14
- 文本颜色为白色,背景色为蓝色
- 设置了宽度和高度
- 同样通过
pack(pady=10)
设置了垂直间距
扩展这个示例,可以考虑以下几点:
添加更多属性:如
anchor
(文本对齐方式)、padx/pady
(内边距)、wraplength
(文本自动换行宽度)等动态更新标签:添加按钮来改变标签的文本或颜色
使用不同的字体和样式:尝试不同的字体、大小和粗细
添加图片标签:除了文本,标签还可以显示图片
2.2 按钮 (Button)
在 Tkinter 中,Button
组件用于创建可点击的按钮,用户点击后会触发指定的操作
示例1
import tkinter as tk
root = tk.Tk()
root.title("Button参数示例")
# 创建一个包含多种参数的按钮
button = tk.Button(
root,
text="点击或悬停",
font=("SimHei", 12),
fg="white",
bg="blue",
width=15,
height=2,
padx=10,
pady=5,
relief=tk.RAISED,
bd=3,
cursor="hand2",
activebackground="red", # 鼠标悬停时变红
activeforeground="yellow", # 鼠标悬停时文本变黄
disabledforeground="gray", # 禁用时文本变灰
command=lambda: print("按钮被点击!")
)
button.pack(pady=20)
# 测试状态变化
def toggle_state():
button.config(state=tk.DISABLED if button["state"] == tk.NORMAL else tk.NORMAL)
tk.Button(root, text="切换按钮状态", command=toggle_state).pack()
root.mainloop()
以下是Button
类的全部参数及其详细说明:
基本参数
master
- 说明:父窗口或容器,即该按钮所属的窗口或框架。
- 示例:
root = tk.Tk(); button = tk.Button(root)
text
- 说明:按钮上显示的文本内容。
- 示例:
text="点击我"
textvariable
- 说明:关联一个
StringVar
对象,用于动态更新按钮文本。- 示例:
var = tk.StringVar() var.set("动态按钮") button = tk.Button(root, textvariable=var)
image
- 说明:按钮上显示的图像(需使用
tk.PhotoImage
或PIL.ImageTk.PhotoImage
)。- 示例:
photo = tk.PhotoImage(file="button.png") button = tk.Button(root, image=photo)
compound
- 说明:当同时设置
text
和image
时,指定文本和图像的组合方式。- 可选值:
tk.NONE
(默认,只显示图像)tk.TOP
(文本在图像上方)tk.BOTTOM
(文本在图像下方)tk.LEFT
(文本在图像左侧)tk.RIGHT
(文本在图像右侧)tk.CENTER
(文本覆盖在图像中央)
command
- 说明:按钮被点击时调用的函数或方法。
- 示例:
def on_click(): print("按钮被点击!") button = tk.Button(root, command=on_click)
外观参数
font
- 说明:文本字体,可指定为元组
(字体名称, 大小, 样式)
或字体对象。- 示例:
font=("SimHei", 12, "bold") # 黑体,12号,加粗
fg
(foreground)
- 说明:文本颜色,可使用颜色名称(如
"red"
)或十六进制值(如"#FF0000"
)。
bg
(background)
- 说明:背景颜色。
width
和height
- 说明:按钮的宽度和高度。
- 单位:
- 若显示文本,单位为字符(默认)。
- 若显示图像,单位为像素。
- 示例:
width=10, height=2
(10 个字符宽,2 行高)
padx
和pady
- 说明:按钮内容与边界的水平 / 垂直间距(内边距),单位为像素。
relief
- 说明:边框样式。
- 可选值:
tk.FLAT
(平的)tk.RAISED
(凸起,默认)tk.SUNKEN
(凹陷)tk.GROOVE
(凹槽)tk.RIDGE
(脊状)
bd
(borderwidth)
- 说明:边框宽度,单位为像素。
highlightbackground
和highlightcolor
- 说明:当按钮获得焦点时,焦点边框的背景色和颜色。
highlightthickness
- 说明:焦点边框的厚度。
状态参数
state
- 说明:按钮的状态。
- 可选值:
tk.NORMAL
(正常,可点击)tk.DISABLED
(禁用,变灰且不可点击)
cursor
- 说明:鼠标悬停在按钮上时的光标样式(如
"hand2"
表示手型)。
按钮状态变化参数
activebackground
和activeforeground
- 说明:鼠标按下或悬停在按钮上时的背景色和文本颜色。
disabledforeground
- 说明:按钮禁用时的文本颜色。
pressed
- 说明:按钮被按下时的状态样式(通过
relief
参数控制)。
事件绑定参数
takefocus
- 说明:是否可以通过 Tab 键聚焦到该按钮。
- 默认:
True
(按钮可通过 Tab 键选中)
command
- 说明:按钮被点击时调用的函数或方法。
- 示例:
def on_click(): print("按钮被点击!") button = tk.Button(root, command=on_click)
其他参数
bitmap
- 说明:显示内置位图(如
"error"
,"hourglass"
等),但已逐渐被image
参数取代。
overrelief
- 说明:鼠标悬停在按钮上时的边框样式(默认与
relief
相同)。
repeatdelay
和repeatinterval
- 说明:当按钮被长按(按住不放)时,重复触发
command
的延迟时间(毫秒)和间隔时间。- 示例:
# 长按200ms后开始每100ms触发一次command button = tk.Button(root, repeatdelay=200, repeatinterval=100)
示例2
import tkinter as tk
def say_hello():
label.config(text="Hello, Tkinter!")
root = tk.Tk()
root.title("按钮示例")
root.geometry("300x200")
# 创建标签
label = tk.Label(root, text="点击按钮打招呼", font=("Arial", 12))
label.pack(pady=20)
# 创建按钮,点击时调用say_hello函数
button1 = tk.Button(root, text="打招呼", command=say_hello)
button1.pack(pady=10)
# 创建一个有状态的按钮
button2 = tk.Button(root,
text="禁用按钮",
state=tk.DISABLED, # 设置按钮状态为禁用
bg="gray")
button2.pack(pady=10)
root.mainloop()
2.3 输入框 (Entry)
在 Tkinter 中,Entry
组件用于创建单行文本输入框,用户可以在其中输入和编辑文本。以下是 Entry
类的全部参数及其详细说明:
基本参数
master
- 说明:父窗口或容器,即该输入框所属的窗口或框架。
- 示例:
root = tk.Tk(); entry = tk.Entry(root)
width
- 说明:输入框的宽度,以字符为单位。
- 示例:
width=20
(可显示 20 个字符)
textvariable
- 说明:关联一个
StringVar
对象,用于动态获取或设置输入框的内容。- 示例:
var = tk.StringVar() entry = tk.Entry(root, textvariable=var) var.set("初始文本") # 设置内容 print(var.get()) # 获取内容
show
- 说明:指定输入时显示的字符(常用于密码输入)。
- 示例:
show="*"
(输入的内容会显示为星号)
外观参数
font
- 说明:文本字体,可指定为元组
(字体名称, 大小, 样式)
或字体对象。- 示例:
font=("SimHei", 12) # 黑体,12号
fg
(foreground)
- 说明:文本颜色,可使用颜色名称(如
"red"
)或十六进制值(如"#FF0000"
)。
bg
(background)
- 说明:背景颜色。
bd
(borderwidth)
- 说明:边框宽度,单位为像素。
relief
- 说明:边框样式。
- 可选值:
tk.FLAT
(平的)tk.RAISED
(凸起)tk.SUNKEN
(凹陷)tk.GROOVE
(凹槽)tk.RIDGE
(脊状)
highlightbackground
和highlightcolor
- 说明:当输入框获得焦点时,焦点边框的背景色和颜色。
highlightthickness
- 说明:焦点边框的厚度。
insertbackground
- 说明:光标(插入点)的颜色。
insertwidth
- 说明:光标(插入点)的宽度,单位为像素。
状态参数
-
state
- 说明:输入框的状态。
- 可选值:
tk.NORMAL
(正常,可编辑)tk.DISABLED
(禁用,不可编辑)tk.READONLY
(只读,可选择但不可编辑)
-
cursor
- 说明:鼠标悬停在输入框上时的光标样式(如
"hand2"
表示手型)。
- 说明:鼠标悬停在输入框上时的光标样式(如
文本对齐参数
justify
- 说明:文本在输入框内的对齐方式。
- 可选值:
tk.LEFT
(左对齐,默认)tk.CENTER
(居中对齐)tk.RIGHT
(右对齐)
输入限制参数
validate
- 说明:指定何时验证输入内容。
- 可选值:
'focus'
(获得或失去焦点时)'focusin'
(获得焦点时)'focusout'
(失去焦点时)'key'
(每次按键时)'all'
(上述所有情况)'none'
(不验证,默认)
validatecommand
- 说明:验证输入的函数,需返回
True
或False
。- 示例:
def validate_input(new_text): return new_text.isdigit() # 只允许输入数字 vcmd = root.register(validate_input) # 注册验证函数 entry = tk.Entry(root, validate="key", validatecommand=(vcmd, '%P'))
'%P'
是传递给验证函数的参数,表示输入框的新内容。
invalidcommand
- 说明:当验证失败时调用的函数。
其他参数
selectbackground
和selectforeground
- 说明:选中文本的背景色和前景色。
selectborderwidth
- 说明:选中文本的边框宽度。
takefocus
- 说明:是否可以通过 Tab 键聚焦到该输入框。
- 默认:
True
(输入框可通过 Tab 键选中)
xscrollcommand
- 说明:关联水平滚动条,用于处理文本超出输入框宽度的情况。
案例1:
import tkinter as tk
root = tk.Tk()
root.title("Entry参数示例")
# 创建一个包含多种参数的输入框
entry = tk.Entry(
root,
width=30,
font=("SimHei", 12),
fg="black",
bg="white",
bd=2,
relief=tk.RIDGE,
justify=tk.CENTER, # 文本居中对齐
insertbackground="red", # 光标为红色
highlightthickness=2,
highlightcolor="blue", # 聚焦时边框变蓝
)
entry.pack(pady=20)
entry.insert(0, "请输入文本...") # 设置初始文本
# 验证输入(只允许输入数字)
def validate_input(new_text):
return new_text.isdigit() or new_text == "" # 允许为空
vcmd = root.register(validate_input)
entry_with_validation = tk.Entry(
root,
width=30,
validate="key",
validatecommand=(vcmd, '%P')
)
entry_with_validation.pack(pady=10)
entry_with_validation.insert(0, "只允许输入数字")
# 密码输入框
password_entry = tk.Entry(
root,
width=30,
show="*" # 显示为星号
)
password_entry.pack(pady=10)
password_entry.insert(0, "password")
# 禁用的输入框
disabled_entry = tk.Entry(
root,
width=30,
state=tk.DISABLED
)
disabled_entry.pack(pady=10)
disabled_entry.insert(0, "禁用状态")
# 显示输入内容
def show_content():
print(f"输入内容: {entry.get()}")
tk.Button(root, text="获取内容", command=show_content).pack(pady=10)
root.mainloop()
案例2:
import tkinter as tk
def show_input():
text = entry.get() # 获取输入框中的文本
label.config(text=f"你输入的是: {text}")
root = tk.Tk()
root.title("输入框示例")
root.geometry("300x200")
# 创建标签
label = tk.Label(root, text="请输入一些文本", font=("Arial", 12))
label.pack(pady=10)
# 创建输入框
entry = tk.Entry(root, width=30)
entry.pack(pady=10)
# 创建按钮,点击时显示输入框中的文本
button = tk.Button(root, text="显示输入", command=show_input)
button.pack(pady=10)
root.mainloop()
2.4 文本框 (Text)
在 Tkinter 中,Text
组件用于创建多行文本输入区域,支持文本编辑、格式化和滚动。以下是 Text
类的全部参数及其详细说明:
基本参数
master
- 说明:父窗口或容器,即该文本框所属的窗口或框架。
- 示例:
root = tk.Tk(); text = tk.Text(root)
width
和height
- 说明:文本框的宽度和高度,以字符为单位。
- 示例:
width=40, height=10
(40 个字符宽,10 行高)
外观参数
font
- 说明:文本字体,可指定为元组
(字体名称, 大小, 样式)
或字体对象。- 示例:
font=("SimHei", 12) # 黑体,12号
fg
(foreground)
- 说明:文本颜色,可使用颜色名称(如
"red"
)或十六进制值(如"#FF0000"
)。
bg
(background)
- 说明:背景颜色。
bd
(borderwidth)
- 说明:边框宽度,单位为像素。
relief
- 说明:边框样式。
- 可选值:
tk.FLAT
(平的)tk.RAISED
(凸起)tk.SUNKEN
(凹陷)tk.GROOVE
(凹槽)tk.RIDGE
(脊状)
highlightbackground
和highlightcolor
- 说明:当文本框获得焦点时,焦点边框的背景色和颜色。
highlightthickness
- 说明:焦点边框的厚度。
padx
和pady
- 说明:文本内容与边框的水平 / 垂直间距(内边距),单位为像素。
滚动和换行参数
wrap
- 说明:文本换行方式。
- 可选值:
tk.CHAR
(按字符自动换行,默认)tk.WORD
(按单词自动换行)tk.NONE
(不自动换行,需水平滚动)
xscrollcommand
和yscrollcommand
- 说明:关联水平 / 垂直滚动条,用于处理文本超出显示区域的情况。
- 示例:
scrollbar = tk.Scrollbar(root) text = tk.Text(root, yscrollcommand=scrollbar.set) scrollbar.config(command=text.yview)
状态参数
state
- 说明:文本框的状态。
- 可选值:
tk.NORMAL
(正常,可编辑)tk.DISABLED
(禁用,不可编辑,但可显示文本)
cursor
- 说明:鼠标悬停在文本框上时的光标样式(如
"hand2"
表示手型)。
文本选择和插入参数
selectbackground
和selectforeground
- 说明:选中文本的背景色和前景色。
selectborderwidth
- 说明:选中文本的边框宽度。
insertbackground
- 说明:光标(插入点)的颜色。
insertwidth
- 说明:光标(插入点)的宽度,单位为像素。
insertofftime
和insertontime
- 说明:光标闪烁的关闭时间和开启时间(毫秒)。
其他参数
undo
- 说明:是否支持撤销 / 重做操作。
- 示例:
undo=True
(启用撤销功能)
maxundo
- 说明:最大撤销步数(当
undo=True
时有效)。
autoseparators
- 说明:是否自动添加撤销分隔符(当
undo=True
时有效)。
takefocus
- 说明:是否可以通过 Tab 键聚焦到该文本框。
- 默认:
True
(文本框可通过 Tab 键选中)
spacing1
,spacing2
,spacing3
- 说明:控制文本行间距。
- 参数:
spacing1
:行上方的额外间距(像素)。spacing2
:折叠行的额外间距(像素)。spacing3
:行下方的额外间距(像素)。
案例1:
import tkinter as tk
root = tk.Tk()
root.title("Text参数示例")
# 创建一个包含多种参数的文本框
text = tk.Text(
root,
width=40,
height=10,
font=("SimHei", 12),
fg="black",
bg="white",
bd=2,
relief=tk.GROOVE,
padx=5,
pady=5,
wrap=tk.WORD, # 按单词换行
undo=True, # 支持撤销操作
insertbackground="red", # 红色光标
selectbackground="yellow", # 黄色选中背景
)
text.pack(pady=20)
# 插入初始文本
text.insert(tk.END, "这是一个多行文本框示例\n"
"支持文本编辑、格式化和滚动。\n"
"你可以尝试输入、删除或选择文本。")
# 创建滚动条
scrollbar = tk.Scrollbar(root, command=text.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text.config(yscrollcommand=scrollbar.set)
# 按钮功能:获取文本内容
def get_text():
content = text.get("1.0", tk.END) # 获取从第1行第0列到末尾的所有文本
print("文本内容:")
print(content)
# 按钮功能:清空文本
def clear_text():
text.delete("1.0", tk.END) # 删除从第1行第0列到末尾的所有文本
# 按钮功能:禁用/启用文本框
def toggle_state():
if text["state"] == tk.NORMAL:
text.config(state=tk.DISABLED)
btn_toggle.config(text="启用编辑")
else:
text.config(state=tk.NORMAL)
btn_toggle.config(text="禁用编辑")
# 创建按钮
btn_get = tk.Button(root, text="获取文本", command=get_text)
btn_get.pack(pady=5)
btn_clear = tk.Button(root, text="清空文本", command=clear_text)
btn_clear.pack(pady=5)
btn_toggle = tk.Button(root, text="禁用编辑", command=toggle_state)
btn_toggle.pack(pady=5)
root.mainloop()
文本操作方法
除了参数外,Text
组件还提供了丰富的方法来操作文本:
插入文本:
text.insert(position, text)
- 示例:
text.insert("1.0", "Hello")
(在第 1 行第 0 列插入文本)删除文本:
text.delete(start, end)
- 示例:
text.delete("1.0", "1.5")
(删除第 1 行前 5 个字符)获取文本:
text.get(start, end)
- 示例:
text.get("1.0", tk.END)
(获取所有文本)标记位置:
text.mark_set(mark_name, position)
- 示例:
text.mark_set("insert", "1.0")
(将光标移到第 1 行第 0 列)添加标签:
text.tag_add(tag_name, start, end)
- 示例:
text.tag_add("highlight", "1.0", "1.5")
(标记第 1 行前 5 个字符)配置标签样式:
text.tag_config(tag_name, options)
- 示例:
text.tag_config("highlight", background="yellow")
(设置高亮背景)
案例2:
import tkinter as tk
def show_text():
text = text_box.get("1.0", tk.END) # 获取文本框中的所有内容
label.config(text=f"你输入的是:\n{text}")
root = tk.Tk()
root.title("文本框示例")
root.geometry("400x300")
# 创建标签
label = tk.Label(root, text="请输入一些文本", font=("Arial", 12))
label.pack(pady=10)
# 创建文本框
text_box = tk.Text(root, width=40, height=10)
text_box.pack(pady=10)
# 在文本框中插入初始文本
text_box.insert(tk.END, "在这里输入多行文本...")
# 创建按钮,点击时显示文本框中的文本
button = tk.Button(root, text="显示文本", command=show_text)
button.pack(pady=10)
root.mainloop()
三、布局管理器
Tkinter 提供了三种主要的布局管理器:pack()
、grid()
和place()
。
3.1 pack () 布局
pack () 布局的工作原理
- 按添加顺序排列:组件按照
pack()
调用的顺序依次放置。- 停靠方向:通过
side
参数控制组件停靠的方向(上、下、左、右)。- 填充和扩展:通过
fill
和expand
参数控制组件如何填充可用空间。- 间距控制:通过
padx
,pady
,ipadx
,ipady
参数调整组件间距。
pack()
是最简单的布局管理器,它按照添加的顺序将组件放置在父容器中。
在 Tkinter 中,pack()
是最简单的布局管理器,它按照添加组件的顺序将它们放置在父容器中。以下是 pack()
方法的全部参数及其详细说明:
几何控制参数
side
- 说明:指定组件停靠的方向。
- 可选值:
tk.TOP
(顶部,默认)tk.BOTTOM
(底部)tk.LEFT
(左侧)tk.RIGHT
(右侧)- 示例:
button.pack(side=tk.LEFT) # 组件靠左排列
fill
- 说明:指定组件在分配的空间内如何填充。
- 可选值:
tk.NONE
(不填充,默认)tk.X
(水平填充)tk.Y
(垂直填充)tk.BOTH
(水平和垂直填充)- 示例:
label.pack(fill=tk.X) # 组件水平方向填充可用空间
expand
- 说明:是否扩展父容器的额外空间给组件。
- 可选值:
False
(不扩展,默认)True
(扩展)- 示例:
frame.pack(expand=True) # 组件将获得父容器的额外空间
间距控制参数
padx
和pady
- 说明:组件外部的水平 / 垂直间距(外边距),单位为像素。
- 示例:
button.pack(padx=10, pady=5) # 组件左右各留10px,上下各留5px
ipadx
和ipady
- 说明:组件内部的水平 / 垂直间距(内边距),单位为像素。
- 示例:
label.pack(ipadx=5, ipady=2) # 组件内容与边框左右各留5px,上下各留2px
对齐控制参数
anchor
- 说明:组件在分配空间内的对齐方式。
- 可选值:
- 方位字符串:
tk.N
,tk.NE
,tk.E
,tk.SE
,tk.S
,tk.SW
,tk.W
,tk.NW
,tk.CENTER
(默认)- 示例:
button.pack(anchor=tk.NW) # 组件对齐到左上角
其他参数
in_
- 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
- 示例:
button.pack(in_=frame) # 将按钮放置在frame内部
实例1:
import tkinter as tk
root = tk.Tk()
root.title("Pack布局示例")
root.geometry("400x300")
# 示例1:side参数演示
frame1 = tk.Frame(root, bg="lightgray", height=100)
frame1.pack(fill=tk.X)
tk.Label(frame1, text="TOP", bg="red").pack(side=tk.TOP)
tk.Label(frame1, text="BOTTOM", bg="green").pack(side=tk.BOTTOM)
tk.Label(frame1, text="LEFT", bg="blue").pack(side=tk.LEFT)
tk.Label(frame1, text="RIGHT", bg="yellow").pack(side=tk.RIGHT)
# 示例2:fill和expand参数演示
frame2 = tk.Frame(root, bg="gray", height=100)
frame2.pack(fill=tk.BOTH, expand=True, pady=10)
tk.Label(frame2, text="fill=BOTH, expand=True", bg="cyan").pack(
fill=tk.BOTH, expand=True, padx=20, pady=20
)
# 示例3:anchor参数演示
frame3 = tk.Frame(root, bg="lightgray", height=100)
frame3.pack(fill=tk.X, pady=10)
tk.Label(frame3, text="NW", bg="purple").pack(anchor=tk.NW)
tk.Label(frame3, text="SE", bg="orange").pack(anchor=tk.SE)
# 示例4:padx/pady和ipadx/ipady参数演示
frame4 = tk.Frame(root, bg="gray", height=100)
frame4.pack(fill=tk.X, pady=10)
tk.Label(frame4, text="外部间距(padx=20, pady=10)", bg="pink").pack(padx=20, pady=10)
tk.Label(frame4, text="内部间距(ipadx=20, ipady=10)", bg="brown").pack(ipadx=20, ipady=10)
root.mainloop()
实例2:
import tkinter as tk
root = tk.Tk()
root.title("pack布局示例")
root.geometry("300x200")
# 创建三个按钮,使用pack布局
button1 = tk.Button(root, text="按钮1", bg="red")
button1.pack(fill=tk.X, padx=10, pady=5) # 水平填充
button2 = tk.Button(root, text="按钮2", bg="green")
button2.pack(fill=tk.BOTH, expand=True, padx=10, pady=5) # 水平和垂直填充并扩展
button3 = tk.Button(root, text="按钮3", bg="blue")
button3.pack(side=tk.BOTTOM, fill=tk.X, padx=10, pady=5) # 放置在底部并水平填充
root.mainloop()
pack () 布局的优缺点
-
优点:
- 简单易用,适合快速布局。
- 适合简单的线性排列(水平或垂直)。
- 与其他布局管理器(如
grid()
)可以混合使用。
-
缺点:
- 难以实现复杂的网格布局。
- 组件位置依赖于添加顺序,修改时可能需要调整多个组件。
- 对于复杂界面,布局代码可能变得冗长且难以维护。
3.2 grid () 布局
grid()
使用表格形式的网格来放置组件,通过指定行和列来确定位置。
grid () 布局的工作原理
- 网格系统:使用
row
和column
参数将组件放置在对应的单元格中。- 跨越行列:通过
rowspan
和columnspan
让组件占据多个单元格。- 对齐方式:使用
sticky
参数控制组件在单元格内的对齐和填充方式。- 扩展比例:通过
weight
参数设置列 / 行在窗口调整大小时的扩展比例。
在 Tkinter 中,grid()
是一种强大的布局管理器,它使用网格系统(行和列)来排列组件。以下是 grid()
方法的全部参数及其详细说明:
网格定位参数
row
和column
- 说明:指定组件放置的行和列(从 0 开始计数)。
- 示例:
label = tk.Label(root, text="姓名") label.grid(row=0, column=0) # 放置在第1行第1列
rowspan
和columnspan
- 说明:指定组件跨越的行数和列数。
- 示例:
button = tk.Button(root, text="提交") button.grid(row=2, column=0, columnspan=2) # 跨越2列
对齐和填充参数
sticky
- 说明:控制组件在网格单元格内的对齐方式和填充方式。
- 可选值:
- 方位字符串组合:
tk.N
,tk.S
,tk.E
,tk.W
(或其组合,如"nsew"
)。- 示例:
# 组件在单元格内水平和垂直方向都填充 entry.grid(row=0, column=1, sticky="nsew") # 组件靠右对齐 button.grid(row=1, column=1, sticky="e")
间距控制参数
padx
和pady
- 说明:组件外部的水平 / 垂直间距(外边距),单位为像素。
- 示例:
label.grid(row=0, column=0, padx=5, pady=5) # 组件四周各留5px间距
ipadx
和ipady
- 说明:组件内部的水平 / 垂直间距(内边距),单位为像素。
- 示例:
button.grid(row=1, column=0, ipadx=10, ipady=5) # 组件内容与边框的间距
权重参数(控制列 / 行的扩展比例)
weight
(通过父容器的grid_rowconfigure()
和grid_columnconfigure()
设置)
- 说明:指定当窗口调整大小时,列 / 行的扩展比例。
- 示例:
# 第0列在窗口扩展时获得2倍的空间 root.grid_columnconfigure(0, weight=2) # 第1列在窗口扩展时获得1倍的空间 root.grid_columnconfigure(1, weight=1)
其他参数
in_
- 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
- 示例:
button.grid(in_=frame, row=0, column=0) # 将按钮放置在frame内部
示例1
import tkinter as tk
root = tk.Tk()
root.title("Grid布局示例")
root.geometry("400x300")
# 配置列权重,使第1列和第2列在窗口扩展时按比例扩展
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=2)
# 配置行权重,使第2行在窗口扩展时获得更多空间
root.grid_rowconfigure(2, weight=1)
# 创建并放置组件
tk.Label(root, text="用户名:", bg="lightblue").grid(
row=0, column=0, sticky="e", padx=5, pady=5
)
tk.Entry(root).grid(
row=0, column=1, sticky="ew", padx=5, pady=5
)
tk.Label(root, text="密码:", bg="lightblue").grid(
row=1, column=0, sticky="e", padx=5, pady=5
)
tk.Entry(root, show="*").grid(
row=1, column=1, sticky="ew", padx=5, pady=5
)
# 跨越两列的按钮
tk.Button(root, text="登录", bg="green", fg="white").grid(
row=2, column=0, columnspan=2, sticky="nsew", padx=5, pady=5
)
# 创建一个跨越多行多列的文本框
tk.Text(root).grid(
row=3, column=0, columnspan=2, rowspan=2,
sticky="nsew", padx=5, pady=5
)
root.mainloop()
示例2
import tkinter as tk
root = tk.Tk()
root.title("grid布局示例")
root.geometry("300x200")
# 创建标签和输入框,使用grid布局
tk.Label(root, text="用户名:").grid(row=0, column=0, sticky=tk.W, padx=10, pady=10)
tk.Entry(root).grid(row=0, column=1, padx=10, pady=10)
tk.Label(root, text="密码:").grid(row=1, column=0, sticky=tk.W, padx=10, pady=10)
tk.Entry(root, show="*").grid(row=1, column=1, padx=10, pady=10)
# 创建按钮
tk.Button(root, text="登录").grid(row=2, column=0, sticky=tk.E, padx=10, pady=10)
tk.Button(root, text="取消").grid(row=2, column=1, sticky=tk.W, padx=10, pady=10)
root.mainloop()
grid () 布局的优缺点
优点:
- 适合创建表格状的布局(如表单、计算器等)。
- 可以精确控制组件的位置和大小。
- 支持窗口调整大小时的自适应扩展。
缺点:
- 比
pack()
更复杂,需要考虑行列关系。- 若行列配置不当,可能导致布局混乱。
- 不适合极复杂的嵌套布局(此时可考虑使用
frame
结合grid()
)。
3.3 place () 布局
place()
通过指定精确的坐标来放置组件,不推荐在复杂界面中使用。
place () 布局的工作原理
- 绝对定位:通过
x
,y
,width
,height
直接指定组件的位置和大小。- 相对定位:通过
relx
,rely
,relwidth
,relheight
指定组件相对于父容器的比例位置和大小。- 混合定位:可以同时使用绝对和相对参数(如
x=50, relwidth=0.5
)。- 对齐方式:使用
anchor
参数调整组件的对齐点。
在 Tkinter 中,place()
是一种精确的布局管理器,允许你通过指定绝对坐标或相对位置来放置组件。以下是 place()
方法的全部参数及其详细说明:
绝对定位参数
x
和y
- 说明:组件左上角相对于父容器的绝对坐标(单位:像素)。
- 示例:
label = tk.Label(root, text="固定位置") label.place(x=50, y=100) # 距离父容器左边缘50px,上边缘100px
width
和height
- 说明:组件的绝对宽度和高度(单位:像素)。
- 示例:
button = tk.Button(root, text="固定大小") button.place(x=20, y=20, width=100, height=30) # 宽100px,高30px
相对定位参数
relx
和rely
- 说明:组件左上角相对于父容器的相对坐标(范围:0.0~1.0)。
- 示例:
# 组件位于父容器水平方向50%、垂直方向30%的位置 label.place(relx=0.5, rely=0.3)
relwidth
和relheight
- 说明:组件相对于父容器的相对宽度和高度(范围:0.0~1.0)。
- 示例:
# 组件宽度为父容器宽度的50%,高度为父容器高度的20% frame.place(relx=0.1, rely=0.1, relwidth=0.5, relheight=0.2)
对齐参数
anchor
- 说明:指定组件的哪个点与
x
,y
或relx
,rely
所指定的位置对齐。- 可选值:
- 方位字符串:
tk.N
,tk.NE
,tk.E
,tk.SE
,tk.S
,tk.SW
,tk.W
,tk.NW
,tk.CENTER
(默认)。- 示例:
# 组件右上角与坐标(100, 50)对齐 button.place(x=100, y=50, anchor=tk.NE)
堆叠顺序参数
bordermode
- 说明:指定坐标计算时是否包含父容器的边框。
- 可选值:
tk.INSIDE
(默认,坐标从父容器内边缘开始计算)tk.OUTSIDE
(坐标从父容器外边缘开始计算)- 示例:
label.place(x=10, y=10, bordermode=tk.INSIDE)
in_
- 说明:指定将组件放置在哪个父容器的子组件中(需是同一父容器的子组件)。
- 示例
button.place(in_=frame, x=5, y=5) # 将按钮放置在frame内部
示例1
import tkinter as tk
root = tk.Tk()
root.title("Place布局示例")
root.geometry("400x300")
# 示例1:绝对定位
tk.Label(root, text="绝对定位", bg="red").place(x=20, y=20, width=100, height=30)
# 示例2:相对定位
tk.Label(root, text="相对定位", bg="green").place(
relx=0.5, rely=0.2, relwidth=0.3, relheight=0.1, anchor=tk.CENTER
)
# 示例3:混合定位
tk.Label(root, text="混合定位", bg="blue").place(
x=50, rely=0.5, width=120, relheight=0.2
)
# 示例4:使用anchor参数
tk.Button(root, text="NW").place(x=100, y=100, anchor=tk.NW)
tk.Button(root, text="SE").place(x=100, y=100, anchor=tk.SE)
# 示例5:相对父容器大小动态调整
frame = tk.Frame(root, bg="gray")
frame.place(relx=0.1, rely=0.6, relwidth=0.8, relheight=0.3)
tk.Label(frame, text="动态调整大小", bg="yellow").place(
relx=0.1, rely=0.1, relwidth=0.8, relheight=0.8
)
root.mainloop()
示例2
import tkinter as tk
root = tk.Tk()
root.title("place布局示例")
root.geometry("300x200")
# 创建几个标签,使用place布局
tk.Label(root, text="标签1", bg="red").place(x=50, y=30, width=100, height=30)
tk.Label(root, text="标签2", bg="green").place(x=120, y=70, width=100, height=30)
tk.Label(root, text="标签3", bg="blue").place(x=80, y=120, width=100, height=30)
root.mainloop()
place () 布局的优缺点
-
优点:
- 精确控制组件的位置和大小。
- 适合创建固定尺寸的界面(如游戏、图形编辑器)。
- 当窗口调整大小时,组件不会自动调整位置,适合需要固定布局的场景。
-
缺点:
- 不支持窗口自适应(窗口调整大小时,组件位置不会自动更新)。
- 布局代码复杂,尤其是在处理多个组件时。
- 若父容器大小改变,可能导致组件重叠或布局混乱。
总结
前三章介绍了 Tkinter 的基础概念、常用组件以及三种布局管理器。学会了如何创建简单的 GUI 应用,配置各种组件的属性,以及使用不同的布局方式来组织界面。这些知识是进一步开发复杂 GUI 应用的基础。