Skip to content

Text 组件

Text(文本)组件用于显示和处理多行文本。在 tkinter 的所有组件中,Text 组件显得异常强大和灵活,它适用于处理多种任务。虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器和网页浏览器使用。

当创建一个 Text 组件的时候,它里面是没有内容的。为了给其插入内容,可以使用 insert() 方法以及 INSERT 或 END 索引号:

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")

text = tk.Text(root, width=30, height=5)
text.pack()
# INSERT索引表示插入光标当前的位置
text.insert(tk.INSERT, "hello ")
text.insert(tk.END, "world !")
root.mainloop()

image-20201201160950166

Indexes用法

Indexes(索引)是用来指向 Text 组件中文本的位置,跟 Python 的序列索引一样,Text 组件索引也是对应实际字符之间的位置。

Tkinter 提供一系列不同的索引类型:

  • line.column(行/列)。
  • line.end(某一行的末尾)。
  • INSERT。
  • END

line.column

用行号和列号组成的字符串是常用的索引方式,它们将索引位置的行号和列号以字符串的形式表示出来(中间以 .分隔,例如 1.0 )。需要注意的是,行号以 1 开始,列号则以 0 开始。还可以使用以下语法构建索引:

python
'%d.%d' % (line, column)

指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。对于这样的指定,tkinter 解释为已有内容的末尾的下一个位置。

需要注意的是,使用 行/列 的索引方式看起来像是浮点值。其实在需要指定索引的时候使用浮点值代替也是可以的:

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")

text = tk.Text(root, width=30, height=10)
text.pack()
text.insert(tk.INSERT, "hello world ! \n")


def show():
    print(text.get(1.6, 1.11))  # 获取第一行,第六个到第是一个字符
    print(text.get(1.6, '1.end'))  # 获取第一行第六个字符后面的所有字符


b1 = tk.Button(root, text='点我点我', command=show)
b1.pack()
root.mainloop()

行号加上字符串 ".end" 的格式表示为该行最后一个字符的位置

image-20201201161200203

插入与删除

python
import tkinter as tk

root = tk.Tk()
root.geometry("500x300+100+100")
text = tk.Text(root, width=30, height=10)

text.pack()
text.insert(tk.INSERT, "hello world ! \n")

b1 = tk.Button(root, text='获取数据', )
b1.pack()
b2 = tk.Button(root, text='插入数据', )
b2.pack()
b3 = tk.Button(root, text='删除数据', )
b3.pack()

b4 = tk.Button(root, text='获取光标位置', )
b4.pack()


def get_text():
    print(text.get(0.0, tk.END))


def insert_text():
    print(text.insert(tk.END, 'hello world !'))


def delete_text():
    print(text.delete(1.0, '1.end'))


def text_cursor():
    print(tk.INSERT)


b1.config(command=get_text)
b2.config(command=insert_text)
b3.config(command=delete_text)
b4.config(command=text_cursor)

root.mainloop()