绘制单行文本使用 Label 组件、多行选项使用 Listbox 组件、输入框使用 Entry 组件
显示和处理多行文本就需要使用我们的 Text 组件了。
Text 组件十分的强大和灵活,适用于多种任务。虽然说 Text 的主要目的是显示多行文本,但是也常常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。例如说我们的 IDLE 就是 Text 组件构成的。
目录
selection(SEL_FIRST, SEL_LAST)
embedded object name(window, images)
例二,如果Marks前边的内容发生变化,那么Mark的位置也会跟着移动(说白了就是Marks会记住它后边的那货):
例三,如果Marks周围的文本被删除了,Marks任然还在(只是它后面的那货被删除了,所以它六神无主,只能初始化为"1.0"):
例四,只有mark_unset()方法可以解除对Marks的封印:
简单用法
下面来演示一下 Text 组件的用法:
from tkinter import *
root = Tk()
text = Text(root, width=30, height=2) #30的意思是30个平均字符的宽度,height设置为两行
text.pack()
text.insert(INSERT, 'I Love\n') #INSERT表示输入光标所在的位置,初始化后的输入光标默认在左上角
text.insert(END, 'Study!')
mainloop()
#生成好的Text组件可以进行编辑(并不是只读形式的)
插入图片和组件
Text 组件不仅支持编辑和插入文本,还支持插入图片和组件。
插入按钮
from tkinter import *
root = Tk()
text = Text(root, width=30, height=5)
text.pack()
text.insert(INSERT, 'I Love\n')
text.insert(END, 'Study!')
def show():
print('呦西,我被点了一下')
b1 = Button(text, text='点我', command=show) #注意放入的是Text而不是root了
text.window_create(INSERT, window=b1)
mainloop()
插入图片
from tkinter import *
root = Tk()
text = Text(root, width=50, height=40)
text.pack()
photo = PhotoImage(file="D:\LOTUS专用图像\study.gif") #只支持GIF格式的
def show():
text.image_create(END, image=photo)
b1 = Button(text, text='点我', command=show) #注意放入的是Text而不是root了
text.window_create(INSERT, window=b1)
mainloop()
Indexs索引
至于想要在 Text 组件中定位,就要使用到Indexs索引了。
Indexs(索引是用来指向 Text 组件中文本的位置,跟 Python 的序列索引一样,Text 组件索引也是对应实际字符之间的位置。
Tkinter 提供一系列不同的索引类型:
索引类型 | 意思 |
---|---|
line.column | 行/列 |
line.end | 某一行的末尾 |
INSERT | |
CURRENT | |
END | |
user-defined marks | |
user-defined tags("tag.first", "tag.last") | |
selection(SEL_FIRST, SEL_LAST) | |
window coordinate("@x,y") | |
embedded object name(window, images) | |
expressions |
line.column
由于 Text 支持多行文本,就是从一维空间变成了二维空间。因此可以用行和列定位一个位置。
那么,行列就是最基础的索引方式,他们将索引位置的行号和列号以字符串的形式表示出来(中间以"."分隔,例如"1.0"表示第一列第一行)。需要注意的是,行号以1开始,列号以0开始。你还可以使用以下语法构建索引:
"%d.%d" % (line, column)
指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。对于这样的指定,Tkinter 解释为已有内容的末尾的下一个位置。
需要注意的是,使用行列的索引方式看起来像是浮点值。其实不只是像而已,你在需要指定索引的时候使用浮点值代替也是可以的:
text.insert(INSERT, 'I LOVE STUDY')
print(text.get('1.2', 1.6)) #1.2 1.6可以不加双引号
使用 index() 方法可以将所有支持的“索引”格式(上面写的那一大堆,11 个)转化为“行/列”格式的索引号
line.end
行号加上字符串 ".end" 的格式表示为该行最后一个字符的位置
text.insert(INSERT, 'I LOVE STUDY')
print(text.get('1.2', '1.end')) # end 为小写
#从第一行第三列到第一行最后
INSERT
INSERT 和下面两个有点类似 C 的宏定义
INSERT (或 "insert" )
对应插入光标的位置
CURRENT
CURRENT (或 "current" ) --用的少
对应与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应(即你松开时的位置)
END(或"end")
对应 Text 组件的文本缓冲区最后一个字符的下一个位置