相关文章推荐
精彩文章免费看

Python-Tkinter 窗口组件之Text

Text

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

何时使用 Text 组件?

Text 组件用于显示文本文档,包含纯文本或格式化文本(使用不同字体,嵌入图片,显示链接,甚至是带 CSS 格式的 HTML 等)。因此,它常常也被用于作为简单的文本编辑器和网页浏览器使用。

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

from tkinter import *
root = Tk()
# width 单行可见的字符
# height 显示的行数
text = Text(root, width=50, height=30, undo=True, autoseparators=False)
text.pack()
# INSERT 光标处插入
# END 末尾处插入
text.insert(INSERT, '插入文字')
root.mainloop()
from tkinter import *
#在 Text 组件中插入对象,可以使用 window_create() 和 image_create() 方法
root = Tk()
# width 单行可见的字符
# height 显示的行数
text = Text(root, width=50, height=30, undo=True, autoseparators=False)
text.pack()
# INSERT 光标处插入
# END 末尾处插入
text.insert(INSERT, '插入组件')
def show():
    print('我被点了一下~')
# 插入组件
bt = Button(root, text='点我', command=show, padx=10)
text.window_create(INSERT, window=bt)
text.insert(INSERT, '\n')
# 插入图片
text.insert(INSERT, '插入图片')
photo = PhotoImage(file='ico.png')
text.image_create(END, image=photo)
root.mainloop()

delete() 方法

from tkinter import *
# 删除 Text 组件中的内容可以用 delete() 方法,下边代码用于删除所有内容(也包含 window 和 image 对象,但不会删除 marks 的内容):
root = Tk()
text = Text(root, width=20, height=5)
text.pack()
text.insert(INSERT, "You are good!")
text.delete(1.0, END)
root.mainloop()
将 state 选项从默认的 "normal" 修改为 "disabled",使得 Text 组件中的内容为“只读”形式。不过需要注意的是,当你需要进行任何修改的时候,记得将 state 选项改回 "normal",否则 insert() 和 delete() 方法都会失效。

get() 方法(仅获取文本内容):

from tkinter import *
import hashlib
root = Tk()
# width 单行可见的字符
# height 显示的行数
text = Text(root, width=50, height=30, undo=True, autoseparators=False)
text.pack()
# INSERT 光标处插入
# END 末尾处插入
text.insert(INSERT, '插入组件')
# 检测内容是否改变
def getSig(contents):
    m = hashlib.md5(contents.encode())
    # 获取摘要 比较
    return m.digest()
sig = getSig(text.get('1.0', END))
def check():
    contents = text.get('1.0', END)
    if sig != getSig(contents):
        print('内容有变动')
    else:
        print('没有变动')
Button(root, text='检查', command=check).pack()
root.mainloop()

index() 方法

from tkinter import *
#用于将所有支持的“索引”格式(请参考下方【Indexes 用法】)转换为“行.列”格式的索引号
root = Tk()
text = Text(root, width=20, height=5)
text.pack()
print(text.index("insert"))
text.insert("insert", "You are good!")
print(text.index("insert"))
root.mainloop()

跟踪一个位置,标记

from tkinter import *
root = Tk()
text = Text(root, width=20, height=5)
text.pack()
text.insert(INSERT, "You are good!")
text.mark_set('here', '1.8')
text.insert('here', "very ")
root.mainloop()

search() 方法可以搜索 Text 组件中的内容。

from tkinter import *
#你可以提供一个确切的目标进行搜索(默认),也可以使用 Tcl 格式的正则表达式进行搜索(需设置 regexp 选项为 True)
root = Tk()
text = Text(root, width=20, height=5)
text.pack()
text.insert(INSERT, 'I love FishC.com')
start = '1.0'
while True:
    pos = text.search('o', start, stopindex=END)
    if not pos:
        break
    print("找到了,位置是:", pos)
    start = pos + '+1c'  # 指向下一个字符
root.mainloop()
# 如果忽略 stopindex 选项,表示直到文本的末尾结束搜索。
#设置 backwards 选项为 True,则是修改搜索的方向(变为向后搜索,那么 start 变量你应该设置为 END,stopindex 选项设置为 1.0,最后 "+1c" 改为 "-1c")

“恢复”和“撤销”操作

from tkinter import *
root = Tk()
text = Text(root, width=50, height=30, undo=True, autoseparators=False)
text.pack()
text.insert(INSERT, 'I love FishC.com')
# 撤销  恢复
# 撤销操作 需要打开 undo=True   Text(root, width=50, height=30,undo=True)
def back():
    text.edit_undo()
def callback(event):
    text.edit_separator()
# 自动插入分隔符,撤销时一个字一个字的撤销,默认人工插入 autoseparators=False
# Text(root, width=50, height=30, undo=True, autoseparators=False)
# 每当有按键操作的时候 插入一个分割符
text.bind('<Key>', callback)
Button(root, text='撤销', command=back).pack()
root.mainloop()

Indexes 用法

Indexes(索引)是用来指向 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"

from tkinter import *
root = Tk()
text = Text(root, width=50, height=30)
text.pack()
text.insert(INSERT, 'I love FishC.com')
# 使用 index() 方法可以将所有支持的“索引”格式转换为“行/列”格式的索引号。
# 行/列是最基础的索引方式,它们将索引位置的行号和列号以字符串的形式表示出来(中间以"."分隔,例如"1.0")。
# 需要注意的是,行号以1开始,列号则以0开始。你还可以使用以下语法构建索引:"%d.%d" % (line, column)
# 指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。对于这样的指定,Tkinter解释为已有内容的末尾的下一个位置。
# 需要注意的是,使用行/列的索引方式看起来像是浮点值。其实不只像而已,你在需要指定索引的时候使用浮点值代替也是可以的
print(text.get(1.2, 1.6))
root.mainloop()

"line.end"

from tkinter import *
root = Tk()
text = Text(root, width=50, height=30)
text.pack()
text.insert(INSERT, 'I love FishC.com')
#行号加上字符串 ".end" 的格式表示为该行最后一个字符的位置
text.insert("insert", "I love Python")
print(text.get("1.2", "1.end"))
# 结果 ;love FishC.comI love Python
root.mainloop()

"insert"

对应插入光标的位置。

"current"

对应与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

"end"

对应 Text 组件的文本缓冲区最后一个字符的下一个位置。

user-defined marks

user-defined marks 是对 Text 组件中位置的命名。"insert" 和 "current" 是两个预先命名好的 marks,除此之外你可以自定义 marks(请参考下方【Marks 用法】)。

User-defined tags

User-defined tags 代表可以分配给 Text 组件的特殊事件绑定和风格(请参考下方【Tags 用法】)。

你可以使用 "tag.first"(使用 tag 的文本的第一个字符之前)和 "tag.last"(使用 tag 的文本的最后一个字符之后)语法表示标签的范围。

"%s.first" % tagname
"%s.last" % tagname
如果查无此 tag,那么 Tkinter 会抛出一个TclError 异常。

selection(SEL_FIRST,SEL_LAST)

selection 是一个名为 SEL(或 "sel")的特殊 tag,表示当前被选中的范围,你可以使用 SEL_FIRST 到 SEL_LAST 来表示这个范围。如果没有选中的内容,那么 Tkinter 会抛出一个TclError 异常。

window coordinate("@x,y")

你还可以使用窗口坐标作为索引。例如在一个事件绑定中,你可以使用以下代码找到最接近鼠标位置的字符:

"@%d,%d" % (event.x, event.y)
embedded object name(window,images)

embedded object name

用于指向在 Text 组件中嵌入的 window 和 image 对象。要引用一个 window,只要简单地将一个 Tkinter 组件实例作为索引即可。引用一个嵌入的 image,只需使用相应的 PhotoImage 和 BitmapImage 对象。

expressions

expressions 用于修改任何格式的索引,用字符串的形式实现修改索引的表达式。
具体表达式实现如下:

"+ count chars"

  • 将索引向前(->)移动 count 个字符
  • 可以越过换行符,但不能超过 END 的位置
  • "- count chars"

  • 将索引向后(<-)移动 count 个字符
  • 可以越过换行符,但不能超过 "1.0" 的位置
  • "+ count lines"

  • 将索引向前(->)移动 count 行
  • 索引会尽量保持与移动前在同一列上,但如果移动后的那一行字符太少,将移动到该行的末尾
  • "- count lines"

  • 将索引向后(<-)移动 count 行
  • 索引会尽量保持与移动前在同一列上,但如果移动后的那一行字符太少,将移动到该行的末尾
  • " linestart"

  • 将索引移动到当前索引所在行的起始位置
  • 注意,使用该表达式前边必须有一个空格隔开
  • " lineend"

  • 将索引移动到当前索引所在行的末尾
  • 注意,使用该表达式前边必须有一个空格隔开
  • " wordstart"

  • 将索引移动到当前索引指向的单词的开头
  • 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合
  • 注意,使用该表达式前边必须有一个空格隔开
  • " wordend"

  • 将索引移动到当前索引指向的单词的末尾
  • 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合
  • 注意,使用该表达式前边必须有一个空格隔开
    TIPS:只要结果不产生歧义,关键字可以被缩写,空格也可以省略。例如:"+ 5 chars" 可以简写成 "+5c"
  • 在实现中,为了确保表达式为普通字符串,你可以使用 str 或格式化操作来创建一个表达式字符串。下边例子演示了如何删除插入光标前边的一个字符:

    def backspace(event):
    event.widget.delete("%s-1c" %"insert" , "insert")

    Marks 用法

    Marks(标记)通常是嵌入到 Text 组件文本中的不可见对象。事实上 Marks 是指定字符间的位置,并跟随相应的字符一起移动。Marks 有 "insert","current" 和 user-defined marks(用户自定义的 Marks)。其中,"insert" 和 "current" 是 Tkinter 预定义的特殊 Marks,它们不能够被删除。

    "insert" 用于指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标(因此并不是所有的 Marks 都不可见)。

    "current" 用于指定与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

    你还可以自定义任意数量的 Marks,Marks 的名字是由普通字符串组成,可以是除了空白字符外的任何字符(为了避免歧义,你应该起一个有意义的名字)。使用 mark_set() 方法创建和移动 Marks。

    如果你在一个 Mark 标记的位置之前插入或删除文本,那么 Mark 跟着一并移动。删除 Marks 你需要使用 mark_unset() 方法,删除 Mark 周围的文本并不会删除 Mark 本身。

    如果有做相关练习的,应该会被 Mark 的很多特性所疑惑,在准备这个内容的时候也很是迷惑,找了不知多少文档......最后总结为下边几个例子讲解:

    例1,Mark 事实上就是索引,用于表示位置:

    import tkinter as tk
    root = tk.Tk()
    text = tk.Text(root, width = 30, heigh = 3)
    text.pack()
    text.insert("insert", "I love Python")
    text.mark_set("here", "1.2")
    text.insert("here", "插")
    root.mainloop()
    

    例2,如果 Mark 前边的内容发生改变,那么 Mark 的位置也会跟着移动(说白了就是 Mark 会“记住”它后边的那货~):

    text.insert("insert", "I love Python")
    text.mark_set("here", "1.2")
    text.insert("here", "插")
    text.insert("here", "入")
    

    例3,如果 Mark 周围的文本被删除了,Mark 仍然还在噢(只是它后边的那货被删除了,所以它六神无主,只能初始化为 "1.0"):

    text.insert("insert", "I love Python")
    text.mark_set("here", "1.2")
    text.insert("here", "插")
    text.delete("1.0", "end")
    text.insert("here", "入")
    

    例4,只有 mark_unset() 方法可以解除 Mark 的封印:

    text.insert("insert", "I love Python")
    text.mark_set("here", "1.2")
    text.insert("here", "插")
    text.mark_unset("here")
    text.delete("1.0", "end")
    text.insert("here", "入")
    

    例5,插入到 Mark 的右侧,通过 mark_gravity() 方法实现(对比例2):

    text.insert("insert", "I love Python")
    text.mark_set("here", "1.2")
    text.mark_gravity("here", "left")  #默认是 "right"
    text.insert("here", "插")
    text.insert("here", "入")
    

    Tags 用法

    Tags(标签)通常用于改变 Text 组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你将文本、嵌入的组件和图片与键盘和鼠标等事件相关联。除了 user-defined tags(用户自定义的 Tags),还有一个预定义的特殊 Tag:SEL。

    SEL(或 "sel")用于表示对应的选中内容(如果有的话)。

    你可以自定义任意数量的 Tags,Tags 的名字是由普通字符串组成,可以是除了空白字符外的任何字符。另外,任何文本内容都支持多个 Tags 描述,任何 Tag 也可以用于描述多个不同的文本内容。

    为指定文本添加 Tags 可以使用 tag_add() 方法:

    from tkinter import *
    root = Tk()
    text = Text(root, width=50, height=30, undo=True, autoseparators=False)
    text.pack()
    text.insert(INSERT, 'I love FishC.com')
    # 行数从1开始 列从0开始
    # 第一个参数 tag的名字 任意
    # 第二个参数 范围:1.7(第一行的第八列)到1.12(第一行第13列),单独的1.14
    text.tag_add('tag1', '1.7', '1.12', '1.14')
    text.tag_config('tag1', background='yellow', foreground='red')
    # 如果对同一个范围内的文本加上多个Tags,并且设置相同的选项,那么新创建的Tag样式会覆盖比较旧的Tag
    # 例如 两个参数,有一个改变了,那么没变的参数  还是用之前的
    text.tag_add('tag2', '1.7', '1.12', '1.14')
    text.tag_config('tag2', background='blue')
    root.mainloop()
    

    tag_congif() 方法可以使用的选项:

    background

  • 指定该 Tag 所描述的内容的背景颜色
  • 注意:bg 并不是该选项的缩写,在这里 bg 被解释为 bgstipple 选项的缩写
  • bgstipple

  • 指定一个位图作为背景,并使用 background 选项指定的颜色填充
  • 只有设置了 background 选项该选项才会生效
  • 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
  • borderwidth

  • 指定文本框的宽度
  • 默认值是 0
  • 只有设置了 relief 选项该选项才会生效
  • 注意:该选项不能使用 bd 缩写
  • fgstipple

  • 指定一个位图作为前景色
  • 默认的标准位图有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
  • 指定该 Tag 所描述的内容使用的字体
  • foreground

  • 指定该 Tag 所描述的内容的前景色
  • 注意:fg 并不是该选项的缩写,在这里 fg 被解释为 fgstipple 选项的缩写
  • justify
    1.控制文本的对齐方式

  • 默认是 "left"(左对齐),还可以选择 "right"(右对齐)和 "center"(居中)
  • 注意:需要将 Tag 指向该行的第一个字符,该选项才能生效
  • lmargin1

  • 设置 Tag 指向的文本块第一行的缩进
  • 默认值是 0
  • 注意:需要将 Tag 指向该文本块的第一个字符或整个文本块,该选项才能生效
  • lmargin2

  • 设置 Tag 指向的文本块除了第一行其他行的缩进
  • 默认值是 0
  • 注意:需要将 Tag 指向整个文本块,该选项才能生效
  • offset

  • 设置 Tag 指向的文本相对于基线的偏移距离
  • 可以控制文本相对于基线是升高(正数值)或者降低(负数值)
  • 默认值是 0
  • overstrike

  • 在 Tag 指定的文本范围画一条删除线
  • 默认值是 False
  • relief

  • 指定 Tag 对应范围的文本的边框样式
  • 可以使用的值有:"sunken", "raised", "groove", "rifge" 或 "flat"
  • 默认值是 "flat"(没有边框)
  • rmargin

  • 设置 Tag 指向的文本块右侧的缩进
  • 默认值是 0
  • spacing1

  • 设置 Tag 所描述的文本块中每一行与上方的空白间隔
  • 注意:自动换行不算
  • 默认值是 0
  • spacing2

  • 设置 Tag 所描述的文本块中自动换行的各行间的空白间隔
  • 注意:换行符('\n')不算
  • 默认值是 0
  • spacing3

  • 设置 Tag 所描述的文本块中每一行与下方的空白间隔
  • 注意:自动换行不算
  • 默认值是 0
  • 定制 Tag 所描述的文本块中 Tab 按键的功能
  • 默认 Tab 被定义为 8 个字符的宽度
  • 你还可以定义多个制表位:tabs=('3c', '5c', '12c') 表示前 3 个 Tab 宽度分别为 3厘米,5厘米,12厘米,接着的 Tab 按照最后两个的差值计算,即:19厘米,26厘米,33厘米
  • 你应该注意到了,它上边 'c' 的含义是“厘米”而不是“字符”,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')
  • 如果是一个整型值,则单位是像素
  • underline

  • 该选项设置为 True 的话,则 Tag 所描述的范围内文本将被画上下划线
  • 默认值是 False
  • 设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行
  • 该选项的值可以是:"none"(不自动换行),"char"(默认)(按字符自动换行)和 "word"(按单词自动换行)
  • tag_raise() 和 tag_lower() 方法来提高和降低某个 Tag 的优先级。

    import tkinter as tk
    root = tk.Tk()
    text = tk.Text(root, width=40, height=5)
    text.pack()
    text.tag_config("tag1", background="yellow", foreground="red")
    text.tag_config("tag2", foreground="green")
    text.tag_lower("tag2")
    text.insert("insert", "I love Python!", ("tag2", "tag1"))
    root.mainloop()
    
    from tkinter import *
    import webbrowser
    root = Tk()
    text = Text(root, width=50, height=30)
    text.pack()
    text.insert(INSERT, 'I love FishC.com')
    # 事件绑定
    text.tag_add('link', '1.7', '1.16')
    text.tag_config('link', foreground='blue', underline=True)
    def show_hand_cursor(event):
        text.config(cursor='arrow')
    def show_xterm_cursor(event):
        text.config(cursor='xterm')
    def click(event):
        webbrowser.open('http://www.baidu.com')
    # 鼠标停留在文字上的时候
    text.tag_bind('link', '<Enter>', show_hand_cursor)
    # 鼠标离开文字的时候
    text.tag_bind('link', '<Leave>', show_xterm_cursor)
    # 左键点击
    text.tag_bind('link', '<Button-1>', click)
    root.mainloop()
    

    autoseparators

  • 指定实现“撤销”操作的时候是否自动插入一个“分隔符”(用于分隔操作记录)
  • 默认值是 True
  • 详见上方用法【“撤销”和“恢复”操作】
  • background / bg

  • 设置 Text 组件的背景颜色
  • 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种背景颜色显示(请参考上方【Tags 用法】)
  • borderwidth / bd

  • 设置 Entry 的边框宽度
  • 默认值是 1 像素
  • cursor

  • 指定当鼠标在 Text 组件上飘过的时候的鼠标样式
  • 默认值由系统指定
  • exportselection

  • 指定选中的文本是否可以被复制到剪贴板
  • 默认值是 True
  • 可以修改为 False 表示不允许复制文本
  • 设置 Text 组件中文本的默认字体
  • 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种字体显示(请参考上方【Tags 用法】)
  • foreground / fg

  • 设置 Text 组件中文本的颜色
  • 注意:通过使用 Tags 可以使 Text 组件中的文本支持多种颜色显示(请参考上方【Tags 用法】)
  • height

  • 设置 Text 组件的高度
  • 注意:单位是行数,不是像素噢
  • highlightbackground

  • 指定当 Text 组件没有获得焦点的时候高亮边框的颜色
  • 默认值由系统指定
  • highlightcolor

  • 指定当 Text 组件获得焦点的时候高亮边框的颜色
  • 默认值由系统指定
  • highlightthickness

  • 指定高亮边框的宽度
  • 默认值是 0
  • insertbackground

  • 设置插入光标的颜色
  • 默认是 BLACK(或 "black")
  • insertborderwidth

  • 设置插入光标的边框宽度
  • 默认值是 0
  • 提示:你得设置 insertwidth 选项为比较大的数值才能看出来噢
  • insertofftime

  • 该选项控制光标的闪烁频率(灭)
  • 单位是毫秒
  • insertontime

  • 该选项控制光标的闪烁频率(亮)
  • 单位是毫秒
  • insertwidth

  • 指定光标的宽度
  • 默认值是 2 像素
  • maxundo

  • 设置允许“撤销”操作的最大次数
  • 默认值是 0
  • 设置为 -1 表示不限制
  • 指定水平方向上的额外间距(内容和边框间)
  • 默认值是 1
  • 指定垂直方向上的额外间距(内容和边框间)
  • 默认值是 1
  • relief

  • 指定边框样式
  • 默认值是 "sunken"
  • 其他可以选择的值是 "flat","raised","groove" 和 "ridge"
  • selectbackground

  • 指定被选中文本的背景颜色
  • 默认值由系统指定
  • selectborderwidth

  • 指定被选中文本的边框宽度
  • 默认值是 0
  • selectforeground

  • 指定被选中文本的字体颜色
  • 默认值由系统指定
  • setgrid

  • 指定一个布尔类型的值,确定是否启用网格控制
  • 默认值是 False
  • spacing1

  • 指定 Text 组件的文本块中每一行与上方的空白间隔
  • 注意:自动换行不算
  • 默认值是 0
  • spacing2

  • 指定 Text 组件的文本块中自动换行的各行间的空白间隔
  • 注意:换行符('\n')不算
  • 默认值是 0
  • spacing3

  • 指定 Text 组件的文本中每一行与下方的空白间隔
  • 注意:自动换行不算
  • 默认值是 0
  • state

  • 默认情况下 Text 组件响应键盘和鼠标事件("normal")
  • 如果将该选项的值设置为 "disabled",那么上述响应就不会发生,并且你无法修改里边的内容
  • 定制 Tag 所描述的文本块中 Tab 按键的功能
  • 默认 Tab 被定义为 8 个字符的宽度
  • 你还可以定义多个制表位:tabs=('3c', '5c', '12c') 表示前 3 个 Tab 宽度分别为 3厘米,5厘米,12厘米,接着的 Tab 按照最后两个的差值计算,即:19厘米,26厘米,33厘米
  • 你应该注意到了,它上边 'c' 的含义是“厘米”而不是“字符”,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p')
  • 如果是一个整型值,则单位是像素
  • takefocus

  • 指定使用 Tab 键可以将焦点移动到 Text 组件中
  • 默认是开启的,可以将该选项设置为 False 避免焦点在此 Text 组件中
  • 该选项设置为 True 开启“撤销”功能
  • 该选项设置为 False 关闭“撤销”功能
  • 默认值是 False
  • width

  • 设置 Text 组件的宽度
  • 注意:单位是字符数,因此 Text 组件的实际宽度还取决于字体的大小
  • 设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行
  • 该选项的值可以是:"none"(不自动换行),"char"(按字符自动换行)和 "word"(按单词自动换行)
  • xscrollcommand

  • 与 scrollbar(滚动条)组件相关联(水平方向)
  • 使用方法可以参考:Scrollbar 组件
  • yscrollcommand

  • 与 scrollbar(滚动条)组件相关联(垂直方向)
  • 使用方法可以参考:Scrollbar 组件
  • bbox(index)
    -- 返回给定索引指定的字符的边界框
    -- 返回值是一个 4 元组:(x, y, width, height)
    -- 如果该字符是不可见的,那么返回 None
    -- 注意:只有当 Text 组件被更新的时候该方法才有效,可以使用 update_idletasks() 方法先更新 Text 组件

    compare(index1, op, index2)
    -- 返回对比 index1 和 index2 指定的两个字符的结果
    -- op 是操作符:'<', '<=', '==', '>=', '>' 或 '!='(不支持 Python 的 '<>' 操作符)
    -- 返回布尔类型的值表示对比的结果

    debug(boolean=None)
    -- 开启或关闭 Debug 状态

    delete(start, end=None)
    -- 删除给定范围的文本或嵌入对象
    -- 如果在给定范围内有任何 Marks 标记的位置,则将 Marks 移动到 start 参数开始的位置

    dlineinfo(index)
    -- 返回给定索引指定的字符所在行的边界框
    -- 返回值是一个 5 元组:(x, y, width, height, offset),offset 表示从该行的顶端到基线的偏移
    -- 如果该行不可见,则返回 None
    -- 注意:只有当 Text 组件被更新的时候该方法才有效,可以使用 update_idletasks() 方法先更新 Text 组件

    dump(index1, index2=None, command=None, **kw)
    -- 返回 index1 和 index2 之间的内容
    -- 返回的值是一个由 3 元组(关键词,值,索引)组成的列表,关键词参数的顺序为:all, image, mark, tag, text, window
    -- 默认关键词是 'all',表示全部关键词均为选中状态
    -- 如果需要筛选个别关键词,可以用 dump(index1, index2, image=True, text=True) 这样的形式调用
    -- 如果指定了 command 函数,那么会为列表中的每一个三元组作为参数调用一次该函数(这种情况下,dump() 不返回值)

    edit_modified(arg=None)
    -- 该方法用于查询和设置 modified 标志(该标标志用于追踪 Text 组件的内容是否发生变化)
    -- 如果不指定 arg 参数,那么返回 modified 标志是否被设置
    -- 你可以传递显式地使用 True 或 False 作为参数来设置或清除 modified 标志
    -- 任何代码或用户的插入或删除文本操作,“撤销”或“恢复”操作,都会是的 modified 标志被设置

    edit_redo(self)
    -- “恢复”上一次的“撤销”操作
    -- 如果 undo 选项为 False,该方法无效
    -- 详见上方用法【“撤销”和“恢复”操作】

    edit_reset()
    -- 清空存放操作记录的栈

    edit_separator()
    -- 插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作
    -- 如果 undo 选项为 False,该方法无效
    -- 详见上方用法【“撤销”和“恢复”操作】

    edit_undo()
    -- 撤销最近一次操作
    -- 如果 undo 选项为 False,该方法无效
    -- 详见上方用法【“撤销”和“恢复”操作】

    get(index1, index2=None)
    -- 返回 index1 到 index2(不包含)之间的文本
    -- 如果 index2 参数忽略,则返回一个字符
    -- 如果包含 image 和 window 的嵌入对象,均被忽略
    -- 如果包含有多行文本,那么自动插入换行符('\n')

    image_cget(index, option)
    -- 返回 index 参数指定的嵌入 image 对象的 option 选项的值
    -- 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常

    image_configure(index, **options)
    -- 修改 index 参数指定的嵌入 image 对象的一个或多个 option 选项的值
    -- 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常

    image_create(index, cnf={}, **kw)
    -- 在 index 参数指定的位置嵌入一个 image 对象
    -- 该 image 对象必须是 Tkinter 的 PhotoImage 或 BitmapImage 实例
    -- 可选选项 align:设定此图像的垂直对齐,可以是 "top"、"center"、"bottom" 或 "baseline"
    -- 可选选项 image:PhotoImage 或 BitmapImage 对象
    -- 可选选项 name:你可以为该图像实例命名,如果你忽略此选项,那么 Tkinter 会自动为其取一个独一无二的名字。
    -- 可选选项 padx:设置水平方向上的额外间距
    -- 可选选项 pady:设置垂直方向上的额外间距

    image_names()
    -- 返回 Text 组件中嵌入的所有 image 对象的名字

    index(index)
    -- 将 index 参数指定的位置以 "line.column" 的索引形式返回
    -- index 参数支持任何格式的索引

    insert(index, text, *tags)
    -- 在 index 参数指定的位置插入字符串
    -- 可选参数 tags 用于指定文本的样式
    -- 详见上方【Tags 用法】

    mark_gravity(self, markName, direction=None)
    -- 设置 Mark 的方向,可以是 "left" 或 "right"(默认是 "right",即如果在 Mark 处插入文本的话,Mark 将发生相应的移动以保持在插入文本的右侧)
    -- 如果设置为 "left",那么在 Mark 处插入文本并不会移动 Mark(因为 Mark 在插入文本的左侧)
    -- 如果忽略 direction 参数,则返回指定 Mark 的方向
    -- 详见上方【Marks 用法】

    mark_names()
    -- 返回 Text 组件中所有 Marks 的名字
    -- 包括两个特殊 Mark:"insert" 和 "current"
    -- 注意:"end" 是特殊的索引,不是 Mark

    mark_next(index)
    -- 返回在 index 指定的位置后边的一个 Mark 的名字
    -- 如果不存在则返回空字符串

    mark_previous(index)
    -- 返回在 index 指定的位置前边的一个 Mark 的名字
    -- 如果不存在则返回空字符串

    mark_set(markName, index)
    -- 移动 Mark 到 index 参数指定的位置
    -- 如果 markName 参数指定的 Mark 不存在,则创建一个新的 Mark

    mark_unset(*markNames)
    -- 删除 markNames 指定的 Marks
    -- 不能删除预定义的 "insert" 和 "current"

    replace(index1, index2, chars, *args)
    -- 将 index1 到 index2 之间的内容替换为 chars 参数指定的字符串
    -- 如果需要为替换的内容添加 Tag,可以在 args 参数指定 Tag
    -- 详见上方【Tags 用法】

    scan_dragto(x, y)
    -- 详见下方 scan_mark(x, y)

    scan_mark(x, y)
    -- 使用这种方式来实现 Text 组件内容的滚动
    -- 需要将鼠标按钮事件以及鼠标当前位置绑定到 scan_mark(x, y) 方法,然后将 <motion> 事件及当前鼠标位置绑定到 scan_dragto(x, y) 方法,就可以实现 Text 组件的内容在当前位置和 scan_mark(x, y) 指定的位置 (x, y) 之间滚动

    search(pattern, index, stopindex=None, forwards=None, backwards=None, exact=None, regexp=None, nocase=None, count=None)
    -- 从 index 开始搜索 pattern,到 stopindex 结束(不指定表示搜索到末尾)
    -- 如果成功找到,以 "line.column" 返回第一个匹配的字符;否则返回空字符串
    -- forwards 参数设置为 True 表示向前(->)搜索
    -- backwards 参数设置为 True 表示向后(<-)搜索
    -- exact 参数设置为 True 表示搜索与 pattern 完全匹配的结果
    -- regexp 参数设置为 True,则 pattern 被解释为 Tcl 格式的正则表达式
    -- nocase 参数设置为 True 是忽略大小写,默认是区分大小写的搜索
    -- count 参数指定为一个 IntVar 的 Tkinter 变量,用于存放当找到匹配的字符个数(如果匹配结果中没有嵌入的 image 或 window 对象的话,一般该值等于 pattern 的字符个数)

    see(index)
    -- 滚动内容,确保 index 指定的位置可见

    tag_add(tagName, index1, index2=None)
    -- 为 index1 到 index2 之间的内容添加一个 Tag(tagName 参数指定)
    -- 如果 index2 参数忽略,则单独为 index1 指定的内容添加 Tag
    -- 详见上方【Tags 用法】

    tag_bind(tagName, sequence, func, add=None)
    -- 为 Tag 绑定事件
    -- 详见上方【Tags 用法】

    tag_cget(tagName, option)
    -- 返回 tagName 指定的 option 选项的值

    tag_config(tagName, cnf=None, **kw)
    -- 跟 tag_configure(tagName, cnf=None, **kw) 一样

    tag_configure(tagName, cnf=None, **kw)
    -- 设置 tagName 的选项
    -- 详见上方【Tags 用法】

    tag_delete(*tagNames)
    -- 删除 tagNames 指定的 Tags

    tag_lower(tagName, belowThis=None)
    -- 降低 Tag 的优先级
    -- 如果 belowThis 参数不为空,则表示 tagName 需要比 belowThis 指定的 Tag 优先级更低
    -- 详见上方【Tags 用法】

    tag_names(index=None)
    -- 如果不带参数,表示返回 Text 组件中所有 Tags 的名字
    -- index 参数表示返回该位置上所有的 Tags 的名字

    tag_nextrange(tagName, index1, index2=None)
    -- 在 index1 到 index2 的范围内第一个 tagName 的位置
    -- 如果没有则返回空字符串

    tag_prevrange(tagName, index1, index2=None)
    -- tag_nextrange() 的反向查找,也就是查找范围是 index2 到 index1

    tag_raise(tagName, aboveThis=None)
    -- 提高 Tag 的优先级
    -- 如果 aboveThis 参数不为空,则表示 tagName 需要比 aboveThis 指定的 Tag 优先级更高
    -- 详见上方【Tags 用法】

    tag_ranges(tagName)
    -- 返回所有 tagName 指定的文本,并将它们的范围以列表的形式返回

    tag_remove(tagName, index1, index2=None)
    -- 删除 index1 到 index2 之间所有的 tagName
    -- 如果忽略 index2 参数,那么只删除 index1 指定的那个字符的 tagName(如果有的话)

    tag_unbind(tagName, sequence, funcid=None)
    -- 解除与 tagName 绑定的事件(sequence 指定)

    window_cget(index, option)
    -- 返回 index 参数指定的嵌入 window 对象的 option 选项的值
    -- 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常

    window_config(index, cnf=None, **kw)
    -- 跟 window_configure(index, cnf=None, **kw) 一样

    window_configure(index, cnf=None, **kw)
    -- 修改 index 参数指定的嵌入 window 对象的一个或多个 option 选项的值
    -- 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常

    window_create(index, **options)
    -- 在 index 参数指定的位置嵌入一个 window 对象
    -- 支持两种方式在 Text 组件中嵌入 window 对象:请看下方 create 选项和 window 选项的描述
    -- 可选选项 align:设定此图像的垂直对齐,可以是 "top"、"center"、"bottom" 或 "baseline"
    -- 可选选项 create:指定一个回调函数用于创建嵌入的 window 组件,该函数没有参数,并且必须创建 Text 的子组件并返回
    -- 可选选项 padx:设置水平方向上的额外间距
    -- 可选选项 pady:设置垂直方向上的额外间距
    -- 可选选项 stretch:该选项控制当行的高度大于嵌入组件的高度时,嵌入组件是否延伸。默认值是 False,表示组件保持原形;设置为 True 表示将该组件垂直部分延伸至行的高度
    -- 可选选项 window:指定一个已经创建好的 window 组件,该组件必须是 Text 组件的子组件

    window_names()
    -- 返回 Text 组件中嵌入的所有 window 对象的名字

    xview(*args)
    -- 该方法用于在水平方向上滚动 Text 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)
    -- 如果第一个参数是 "moveto",则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端
    -- 如果第一个参数是 "scroll",则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 "units" 或 "pages"),例如:xview("scroll", 3, "units") 表示向右滚动三行

    xview_moveto(fraction)
    -- 跟 xview("moveto", fraction) 一样

    xview_scroll(number, what)
    -- 跟 xview("scroll", number, what) 一样

    yview(*args)
    -- 该方法用于在垂直方向上滚动 Text 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现(具体操作参考:Scrollbar)
    -- 如果第一个参数是 "moveto",则第二个参数表示滚动到指定的位置:0.0 表示最顶端,1.0 表示最底端
    -- 如果第一个参数是 "scroll",则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 "units" 或 "pages"),例如:yview("scroll", 3, "pages") 表示向下滚动三页

    yview_moveto(fraction)
    -- 跟 yview("moveto", fraction) 一样

    yview_scroll(number, what)
    -- 跟 yview("scroll", number, what) 一样

     
    推荐文章