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 列的文本

三、核心功能详解

  1. 文本索引(定位文本的核心)
    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行末尾
  1. 格式化文本(标签 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()
  1. 绑定滚动条
    当文本内容超过 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()
  1. 设置只读 / 可编辑状态
    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。

  1. 插入图片 / 组件(高级用法)
    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()

总结

  1. 核心定位:Text 是 Tkinter 多行文本核心组件,支持显示 / 编辑 / 格式化,功能远超 Entry;
  2. 基础操作:重点掌握 insert()/get()/delete() 实现文本增删查,通过 state 控制只读 / 可编辑;
  3. 高级功能:Tag 实现文本格式化,绑定 Scrollbar 处理长文本,支持插入图片 / 组件;
  4. 实战技巧:结合文件对话框(filedialog)可实现记事本、日志查看器等实用工具。
    掌握 Text 组件后,你可以轻松实现各类文本相关的 GUI 功能,是 Tkinter 开发中必备的核心技能。
© 版权声明

相关文章