Tkinter Text 文本框组件完全指南
前言
Text 组件是 Tkinter 中功能最强大的多行文本编辑组件,不仅能显示 / 编辑多行文本,还支持格式化(字体、颜色)、插入图片 / 组件、撤销 / 重做、搜索替换等高级功能,是实现记事本、编辑器、日志展示等功能的核心组件。
一、Text 组件核心特点
支持多行文本输入 / 显示(区别于 Entry 单行输入框);
可编辑(默认)或只读(设置 state=DISABLED);
支持文本格式化(不同位置设置不同字体、颜色、大小);
支持插入图片、按钮等其他 Tkinter 组件;
支持文本索引、标记、标签等高级操作;
可绑定滚动条,处理长文本。
二、基础使用(最简示例)
先从最核心的 “创建 + 插入 + 读取文本” 开始,掌握基础用法:
import tkinter as tk
root = tk.Tk()
root.title("Text 基础示例")
root.geometry("400x200")
# 1. 创建 Text 组件
# width:字符宽度,height:行数,font:字体,wrap:换行方式(WORD=按单词换行,CHAR=按字符)
text = tk.Text(
root,
width=50, # 宽度(按字符数)
height=8, # 高度(按行数)
font=("Consolas", 10), # 字体(等宽字体适合显示代码/字符画)
wrap=tk.WORD, # 自动换行:按单词拆分(避免单词被截断)
padx=5, # 水平内边距
pady=5 # 垂直内边距
)
text.pack(pady=10)
# 2. 插入文本(核心操作)
# insert(位置, 内容):位置格式 "行.列"(行/列从1开始),END 表示文本末尾
text.insert(tk.END, "Hello Tkinter Text!\n") # 末尾插入,换行
text.insert("1.0", "【开头插入】") # 在第1行第0列(开头)插入文本
# 3. 读取文本(核心操作)
def get_text():
# get(起始位置, 结束位置):读取指定范围文本,1.0=第1行第0列,END=末尾
content = text.get("1.0", tk.END)
print("Text 内容:\n", content)
# 4. 按钮触发读取
tk.Button(root, text="读取文本", command=get_text).pack()
root.mainloop()
关键基础操作说明
| 操作 | 代码示例 | 说明 |
|---|---|---|
| 创建 | text = tk.Text(root, width=50, height=8) | 必选父容器,可选宽 / 高 / 字体等样式 |
| 插入文本 | text.insert(“1.0”, “内容”)/text.insert(tk.END, “内容”) | “行。列” 定位,tk.END 是末尾常量 |
| 读取文本 | text.get(“1.0”, tk.END) | 读取从第 1 行第 0 列到末尾的所有文本 |
| 清空文本 | text.delete(“1.0”, tk.END) | 删除指定范围文本,清空用 “1.0” 到 END |
| 替换文本 | text.replace(“1.0”, “1.5”, “新内容”) | 替换第 1 行第 0 列到第 1 行第 5 列的文本 |
三、核心功能详解
- 文本索引(定位文本的核心)
Text 组件通过索引定位字符位置,格式灵活,常用索引:
行.列:精确位置,如 “1.0”(第 1 行第 0 列)、“3.5”(第 3 行第 5 列);
tk.END:文本末尾;
tk.INSERT:光标当前位置;
tk.CURRENT:鼠标指针下的字符位置;
相对索引:如 “1.0 + 2 chars”(第 1 行第 0 列后 2 个字符)、“END – 1 line”(末尾上一行)。
# 在光标位置插入文本
text.insert(tk.INSERT, "光标处插入")
# 读取第2行到第4行的文本
content = text.get("2.0", "4.END") # "4.END" 表示第4行末尾
- 格式化文本(标签 Tag 功能)
Tag 是 Text 组件的核心特性,可给指定文本范围设置字体、颜色、背景色等样式,甚至绑定事件:
import tkinter as tk
root = tk.Tk()
root.title("Text 格式化示例")
root.geometry("400x200")
text = tk.Text(root, width=50, height=8, font=("Arial", 10))
text.pack(pady=10)
# 1. 插入基础文本
text.insert(tk.END, "普通文本\n")
text.insert(tk.END, "加粗红色文本\n")
text.insert(tk.END, "蓝色背景文本\n")
text.insert(tk.END, "超大号字体文本")
# 2. 创建标签(定义样式)
# tag_config(标签名, 样式参数)
text.tag_config("bold_red", font=("Arial", 10, "bold"), foreground="red")
text.tag_config("blue_bg", background="#0099ff", foreground="white")
text.tag_config("big_font", font=("Arial", 16, "bold italic"))
# 3. 给指定文本范围应用标签
# tag_add(标签名, 起始位置, 结束位置)
text.tag_add("bold_red", "2.0", "2.END") # 第2行全部应用 bold_red
text.tag_add("blue_bg", "3.0", "3.END") # 第3行全部应用 blue_bg
text.tag_add("big_font", "4.0", "4.END") # 第4行全部应用 big_font
root.mainloop()
- 绑定滚动条
当文本内容超过 Text 组件可视区域时,需绑定滚动条(Scrollbar):
import tkinter as tk
root = tk.Tk()
root.title("Text 滚动条示例")
root.geometry("400x200")
# 1. 创建滚动条
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y) # 右侧垂直填充
# 2. 创建 Text 组件,关联滚动条
text = tk.Text(
root,
width=50,
height=8,
yscrollcommand=scrollbar.set # Text 滚动时同步滚动条
)
text.pack(side=tk.LEFT, fill=tk.BOTH)
# 3. 滚动条关联 Text(滚动条拖动时同步 Text)
scrollbar.config(command=text.yview)
# 4. 插入大量文本测试滚动
for i in range(20):
text.insert(tk.END, f"这是第 {i+1} 行测试文本\n")
root.mainloop()
- 设置只读 / 可编辑状态
Text 组件默认可编辑,通过 state 参数控制状态:
import tkinter as tk
root = tk.Tk()
root.title("Text 只读/可编辑")
root.geometry("400x200")
text = tk.Text(root, width=50, height=8)
text.pack(pady=10)
text.insert(tk.END, "这是只读文本,无法编辑!")
# 1. 设置为只读(DISABLED)
text.config(state=tk.DISABLED)
# 2. 切换状态的函数
def toggle_state():
if text["state"] == tk.NORMAL:
text.config(state=tk.DISABLED)
btn.config(text="切换为可编辑")
else:
# 注意:设置为可编辑前需先改为 NORMAL
text.config(state=tk.NORMAL)
btn.config(text="切换为只读")
btn = tk.Button(root, text="切换为可编辑", command=toggle_state)
btn.pack()
root.mainloop()
注意:设置为 DISABLED 后,无法插入 / 修改文本,如需修改,需先临时改为 NORMAL,修改后再改回 DISABLED。
- 插入图片 / 组件(高级用法)
Text 支持插入 PhotoImage 图片或其他 Tkinter 组件(如按钮):
import tkinter as tk
root = tk.Tk()
root.title("Text 插入图片/组件")
root.geometry("400x250")
text = tk.Text(root, width=50, height=10)
text.pack(pady=10)
# 1. 插入图片
img = tk.PhotoImage(file="icon.png").subsample(4,4) # 缩放图片
text.insert(tk.END, "插入的图片:\n")
# image_create(位置, image=图片对象)
text.image_create(tk.END, image=img)
text.insert(tk.END, "\n") # 换行
# 2. 插入按钮组件
def btn_click():
print("Text 内的按钮被点击了!")
btn = tk.Button(text, text="内置按钮", command=btn_click)
text.window_create(tk.END, window=btn) # window_create 插入组件
# 保留图片引用(避免垃圾回收)
root.img = img
root.mainloop()
四、常用方法速查表
| 方法 | 作用 | 示例 |
|---|---|---|
| insert(index, text) | 在指定位置插入文本 | text.insert(END, “新文本”) |
| delete(start, end) | 删除指定范围文本 | text.delete(“1.0”, END)(清空) |
| get(start, end) | 读取指定范围文本 | content = text.get(“1.0”, END) |
| replace(start, end, text) | 替换指定范围文本 | text.replace(“1.0”, “1.5”, “替换”) |
| tag_config(tag, **kwargs) | 定义标签样式 | text.tag_config(“red”, fg=“red”) |
| tag_add(tag, start, end) | 给文本应用标签 | text.tag_add(“red”, “2.0”, “2.END”) |
| see(index) | 滚动到指定位置 | text.see(“10.0”)(滚动到第 10 行) |
| undo()/redo() | 撤销 / 重做操作 | text.undo()(需开启 undo=True) |
| search(pattern, start) | 搜索文本 | pos = text.search(“Python”, “1.0”) |
五、实战示例:简易记事本
整合上述知识点,实现一个带 “新建 / 打开 / 保存 / 清空” 功能的简易记事本:
import tkinter as tk
from tkinter.filedialog import askopenfilename, asksaveasfilename
import os
def new_file():
"""新建文件:清空文本,重置标题"""
text.delete("1.0", tk.END)
root.title("简易记事本 - 未命名")
global file_path
file_path = ""
def open_file():
"""打开文件:读取本地文本文件"""
global file_path
file_path = askopenfilename(
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
text.delete("1.0", tk.END)
with open(file_path, "r", encoding="utf-8") as f:
text.insert(tk.END, f.read())
root.title(f"简易记事本 - {os.path.basename(file_path)}")
def save_file():
"""保存文件:保存到本地"""
global file_path
if not file_path:
file_path = asksaveasfilename(
defaultextension=".txt",
filetypes=[("文本文件", "*.txt"), ("所有文件", "*.*")]
)
if file_path:
with open(file_path, "w", encoding="utf-8") as f:
f.write(text.get("1.0", tk.END))
root.title(f"简易记事本 - {os.path.basename(file_path)}")
# 主窗口
root = tk.Tk()
root.title("简易记事本 - 未命名")
root.geometry("500x400")
# 菜单栏
menu_bar = tk.Menu(root)
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="新建", command=new_file)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_command(label="保存", command=save_file)
file_menu.add_separator()
file_menu.add_command(label="退出", command=root.quit)
menu_bar.add_cascade(label="文件", menu=file_menu)
root.config(menu=menu_bar)
# 滚动条 + Text
scrollbar = tk.Scrollbar(root)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
text = tk.Text(root, undo=True, yscrollcommand=scrollbar.set)
text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
scrollbar.config(command=text.yview)
# 全局变量:文件路径
file_path = ""
root.mainloop()
总结
- 核心定位:Text 是 Tkinter 多行文本核心组件,支持显示 / 编辑 / 格式化,功能远超 Entry;
- 基础操作:重点掌握 insert()/get()/delete() 实现文本增删查,通过 state 控制只读 / 可编辑;
- 高级功能:Tag 实现文本格式化,绑定 Scrollbar 处理长文本,支持插入图片 / 组件;
- 实战技巧:结合文件对话框(filedialog)可实现记事本、日志查看器等实用工具。
掌握 Text 组件后,你可以轻松实现各类文本相关的 GUI 功能,是 Tkinter 开发中必备的核心技能。
© 版权声明
文章版权归作者所有,未经允许请勿转载。