1. 程式人生 > >Tkinter 元件詳解(十一):Text

Tkinter 元件詳解(十一):Text

Text(文字)元件用於顯示和處理多行文字。在 Tkinter 的所有元件中,Text 元件顯得異常強大和靈活,適用於多種任務。雖然該元件的主要目的是顯示多行文字,但它常常也被用於作為簡單的文字編輯器和網頁瀏覽器使用。

何時使用 Text 元件?

Text 元件用於顯示文字文件,包含純文字或格式化文字(使用不同字型,嵌入圖片,顯示連結,甚至是帶 CSS 格式的 HTML 等)。因此,它常常也被用於作為簡單的文字編輯器和網頁瀏覽器使用。

用法

當你建立一個 Text 元件的時候,它裡邊是沒有內容的。為了給其插入內容,你可以使用 insert() 方法以及 "insert" 或 "end" 索引號:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root)
text.pack()

# "insert" 索引表示插入游標當前的位置
text.insert("insert", "I love ")
text.insert("end", "Python.com!")

root.mainloop()

值得一提的是,Text 元件的 insert() 方法有一個可選的引數,用於指定一個或多個“標籤”(標籤用於設定文字的格式,請參考下方【Tags 用法】)到新插入的文字中:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=20, height=5)
text.pack()

# 設定 tag
text.tag_config("tag_1", backgroun="yellow", foreground="red")

# "insert" 索引表示插入游標當前的位置
text.insert("insert", "I love ")
text.insert("end", "FishC.com!", "tag_1")

root.mainloop()

在 Text 元件中插入物件,可以使用 window_create() 和 image_create() 方法:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=20, height=5)
text.pack()

text.insert("insert", "I love Python!")

def show():
    print("哎呀,我被點了一下~")
    
b1 = tk.Button(text, text="點我點我", command=show)
text.window_create("insert", window=b1)

root.mainloop()
    

刪除 Text 元件中的內容可以用 delete() 方法,下邊程式碼用於刪除所有內容(也包含 window 和 image 物件,但不會刪除 marks 的內容):

text.delete(1.0, "end")

刪除單獨一個字元(或者一個 window 物件,或者一個 image 物件),你可以僅使用一個引數:

text.delete(b1)

將 state 選項從預設的 "normal" 修改為 "disabled",使得 Text 元件中的內容為“只讀”形式。不過需要注意的是,當你需要進行任何修改的時候,記得將 state 選項改回 "normal",否則 insert() 和 delete() 方法都會失效。

獲得 Text 元件的內容,可以使用 get() 方法(僅獲取文字內容):

contents = text.get(1.0, "end")

在下邊例子中,通過校檢 Text 元件中文字的 MD5 摘要來判斷內容是否發生改變:

import tkinter as tk
import hashlib

root = tk.Tk()

text = tk.Text(root, width=20, height=5)
text.pack()

text.insert("insert", "I love Python.com!")
contents = text.get(1.0, "end")

def getSig(contents):
    m = hashlib.md5(contents.encode())
    return m.digest()

sig = getSig(contents)

def check():
    contents = text.get(1.0, "end")
    if sig != getSig(contents):
        print("警報:內容發生變動!")
    else:
        print("風平浪靜~")

tk.Button(root, text="檢查", command=check).pack()

root.mainloop()

           

index() 方法用於將所有支援的“索引”格式(請參考下方【Indexes 用法】)轉換為“行.列”格式的索引號:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=20, height=5)
text.pack()

print(text.index("insert"))
text.insert("insert", "You are good!")
print(text.index("insert"))

root.mainloop()

如果你需要跟蹤一個位置,那麼你可以將該位置“標記”下來(請參考下方【Marks 用法】):

import tkinter as tk

root = tk.Tk()

text = tk.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 元件中的內容。你可以提供一個確切的目標進行搜尋(預設),也可以使用 Tcl 格式的正則表示式進行搜尋(需設定 regexp 選項為 True):

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=20, height=5)
text.pack()

text.insert("insert", "I love Python.com!")

# 將任何格式的索引號統一為元組 (行,列) 的格式輸出
def getIndex(text, index):
    return tuple(map(int, str.split(text.index(index), ".")))

start = 1.0
while True:
    pos = text.search("o", start, stopindex="end")
    if not pos:
        break
    print("找到啦,位置是:", getIndex(text, pos))
    start = pos + "+1c"  # 將 start 指向下一個字元


root.mainloop()

如果忽略 stopindex 選項,表示直到文字的末尾結束搜尋。設定 backwards 選項為 True,則是修改搜尋的方向(變為向後搜尋,那麼 start 變數你應該設定為 END,stopindex 選項設定為 1.0,最後 "+1c" 改為 "-1c")

“恢復”和“撤銷”操作

Text 元件還支援“恢復”和“撤銷”操作,這使得 Text 元件顯得相當高大上。

通過設定 undo 選項為 True 可以開啟 Text 元件的“撤銷”功能。然後用 edit_undo() 方法實現“撤銷”操作,用 edit_redo() 方法實現“恢復”操作。

這是因為 Text 元件內部有一個棧專門用於記錄內容的每次變動,所以每次“撤銷”操作就是一次彈棧操作,“恢復”就是再次壓棧。

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=40, height=5, undo = True)
text.pack()


def move():
    text.edit_undo()

tk.Button(root, text = "撤銷", command = move).pack()

root.mainloop()

大概就是下圖這麼回事

預設情況下,每一次完整的操作將會放入棧中。但怎麼樣算是一次完整的操作呢?Tkinter 覺得每次焦點切換、使用者按下 Enter 鍵、刪除\插入操作的轉換等之前的操作算是一次完整的操作。也就是說你連續輸入“I love PythonP”的話,一次的“撤銷”操作就會將所有的內容刪除。

那我們能不能自定義呢?比如我希望插入一個字元就算一次完整的操作,然後每次點選“撤銷”就去掉一個字元。

當然可以!做法就是先將 autoseparators 選項設定為 False(因為這個選項是讓 Tkinter 在認為一次完整的操作結束後自動插入“分隔符”),然後繫結鍵盤事件,每次有輸入就用 edit_separator() 方法人為地插入一個“分隔符”:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=40, height=5, autoseparators=False, undo=True, maxundo=10)
text.pack()

def callback(event):
    text.edit_separator()

text.bind('<Key>', callback)

text.insert("insert", "I love Python!")


def move():
    text.edit_undo()

tk.Button(root, text = "撤銷", command = move).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"

行/列 是最基礎的索引方式,它們將索引位置的行號和列號以字串的形式表示出來(中間以 "." 分隔,例如 "1.0")。需要注意的是,行號以 1 開始,列號則以 0 開始。你還可以使用以下語法構建索引:

"%d.%d" % (line, column)

指定超出現有文字的最後一行的行號,或超出一行中列數的列號都不會引發錯誤。對於這樣的指定,Tkinter 解釋為已有內容的末尾的下一個位置。

需要注意的是,使用 行/列 的索引方式看起來像是浮點值。其實不只像而已,你在需要指定索引的時候使用浮點值代替也是可以的:

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

使用 index() 方法可以將所有支援的“索引”格式轉換為“行/列”格式的索引號。

"line.end"

行號加上字串 ".end" 的格式表示為該行最後一個字元的位置:

text.insert("insert", "I love Python")
print(text.get("1.2", "1.end"))
>>>
love Python

 "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" 1. 將索引向前(->)移動 count 個字元
2. 可以越過換行符,但不能超過 END 的位置
"- count chars" 1. 將索引向後(<-)移動 count 個字元
2. 可以越過換行符,但不能超過 "1.0" 的位置
"+ count lines" 1. 將索引向前(->)移動 count 行
2. 索引會盡量保持與移動前在同一列上,但如果移動後的那一行字元太少,將移動到該行的末尾
"- count lines" 1. 將索引向後(<-)移動 count 行
2. 索引會盡量保持與移動前在同一列上,但如果移動後的那一行字元太少,將移動到該行的末尾
" linestart" 1. 將索引移動到當前索引所在行的起始位置
2. 注意,使用該表示式前邊必須有一個空格隔開
" lineend" 1. 將索引移動到當前索引所在行的末尾
2. 注意,使用該表示式前邊必須有一個空格隔開
" wordstart" 1. 將索引移動到當前索引指向的單詞的開頭
2. 單詞的定義是一系列字母、數字、下劃線或任何非空白字元的組合
3. 注意,使用該表示式前邊必須有一個空格隔開
" wordend" 1. 將索引移動到當前索引指向的單詞的末尾
2. 單詞的定義是一系列字母、數字、下劃線或任何非空白字元的組合
3. 注意,使用該表示式前邊必須有一個空格隔開

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", "入")



看,其實也沒有那麼難嘛~

好,講最後一點,我們看到了,預設插入內容到 Mark,是插入到它的左側(就是說插入一個字元的話,Mark 向後移動了一個字元的位置)。那能不能插入到 Mark 的右側呢?其實是可以的,通過 mark_gravity() 方法就可以實現。

例5(對比例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() 方法:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=40, height=5)
text.pack()

text.insert("insert", "I love Python.com!")

text.tag_add("tag1", "1.7", "1.13", "1.15")
text.tag_config("tag1", background="yellow", foreground="red")
    
root.mainloop()

如上,使用 tag_config() 方法可以設定 Tags 的樣式。下邊羅列了 tag_congif() 方法可以使用的選項:

選項 含義
background 1. 指定該 Tag 所描述的內容的背景顏色
2. 注意:bg 並不是該選項的縮寫,在這裡 bg 被解釋為 bgstipple 選項的縮寫
bgstipple 1. 指定一個位圖作為背景,並使用 background 選項指定的顏色填充
2. 只有設定了 background 選項該選項才會生效
3. 預設的標準點陣圖有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
borderwidth 1. 指定文字框的寬度
2. 預設值是 0
3. 只有設定了 relief 選項該選項才會生效
4. 注意:該選項不能使用 bd 縮寫
fgstipple 1. 指定一個位圖作為前景色
2. 預設的標準點陣圖有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
font 指定該 Tag 所描述的內容使用的字型
foreground 1. 指定該 Tag 所描述的內容的前景色
2. 注意:fg 並不是該選項的縮寫,在這裡 fg 被解釋為 fgstipple 選項的縮寫
justify 1. 控制文字的對齊方式
2. 預設是 "left"(左對齊),還可以選擇 "right"(右對齊)和 "center"(居中)
3. 注意:需要將 Tag 指向該行的第一個字元,該選項才能生效
lmargin1 1. 設定 Tag 指向的文字塊第一行的縮排
2. 預設值是 0
3. 注意:需要將 Tag 指向該文字塊的第一個字元或整個文字塊,該選項才能生效
lmargin2 1. 設定 Tag 指向的文字塊除了第一行其他行的縮排
2. 預設值是 0
3. 注意:需要將 Tag 指向整個文字塊,該選項才能生效
offset

1. 設定 Tag 指向的文字相對於基線的偏移距離

2. 可以控制文字相對於基線是升高(正數值)或者降低(負數值)
3. 預設值是 0
overstrike 1. 在 Tag 指定的文字範圍畫一條刪除線
2. 預設值是 False
relief 1. 指定 Tag 對應範圍的文字的邊框樣式
2. 可以使用的值有:"sunken", "raised", "groove", "rifge" 或 "flat"
3. 預設值是 "flat"(沒有邊框)
rmargin 1. 設定 Tag 指向的文字塊右側的縮排
2. 預設值是 0
spacing1 1. 設定 Tag 所描述的文字塊中每一行與上方的空白間隔
2. 注意:自動換行不算
3. 預設值是 0
spacing2 1. 設定 Tag 所描述的文字塊中自動換行的各行間的空白間隔
2. 注意:換行符('\n')不算
3. 預設值是 0
spacing3 1. 設定 Tag 所描述的文字塊中每一行與下方的空白間隔 
2. 注意:自動換行不算
3. 預設值是 0
tabs 1. 定製 Tag 所描述的文字塊中 Tab 按鍵的功能
2. 預設 Tab 被定義為 8 個字元的寬度
3. 你還可以定義多個製表位:tabs=('3c', '5c', '12c') 表示前 3 個 Tab 寬度分別為 3釐米,5釐米,12釐米,接著的 Tab 按照最後兩個的差值計算,即:19釐米,26釐米,33釐米
4. 你應該注意到了,它上邊 'c' 的含義是“釐米”而不是“字元”,還可以選擇的單位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大約是 '1i' 等於 '72p')
5. 如果是一個整型值,則單位是畫素
underline 1. 該選項設定為 True 的話,則 Tag 所描述的範圍內文字將被畫上下劃線
2. 預設值是 False
wrap 1. 設定當一行文字的長度超過 width 選項設定的寬度時,是否自動換行
2. 該選項的值可以是:"none"(不自動換行),"char"(預設)(按字元自動換行)和 "word"(按單詞自動換行)

如果你對同一個範圍內的文字加上多個 Tags,並且設定相同的選項,那麼新建立的 Tag 樣式會覆蓋比較舊的 Tag:

import tkinter as tk

root = tk.Tk()

text = tk.Text(root, width=40, height=5)
text.pack()


text.tag_add("tag1", "1.7", "1.13", "1.15")
text.tag_config("tag1", background="yellow", foreground="red")  # 舊的 Tag
text.tag_config("tag2", foreground="blue")  # 新的 Tag

# 那麼新建立的 Tag2 會覆蓋比較舊的 Tag1 的相同選項
# 注意,與下邊的呼叫順序沒有關係
text.insert("insert", "I love Python.com!", ("tag2", "tag1"))
    
root.mainloop()

你或許想控制 Tags 間的優先順序,這可以實現嗎?完全沒有問題!你可以使用 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()


另外 Tags 還支援事件繫結,使用的是 tag_bind() 的方法。

下邊例子中我們將文字("Python.com")與滑鼠事件進行繫結,當滑鼠進入該文字段的時候,滑鼠樣式切換為 "arrow" 形態,離開文字段的時候切換回 "xterm" 形態。當觸發滑鼠“左鍵點選操作”事件的時候,使用預設瀏覽器開啟Python的首頁(https://www.python.org/):

import tkinter as tk
import webbrowser

root = tk.Tk()

text = tk.Text(root, width=40, height=5)
text.pack()

text.insert("insert", "I love Python.com!")

text.tag_add("link", "1.7", "1.17")
text.tag_config("link", foreground = "blue", underline = True)

def show_arrow_cursor(event):
    text.config(cursor = "arrow")

def show_xterm_cursor(event):
    text.config(cursor = "xterm")

def click(event):
    webbrowser.open("https://www.python.org/")

text.tag_bind("link", "<Enter>", show_arrow_cursor)
text.tag_bind("link", "<Leave>", show_xterm_cursor)
text.tag_bind("link", "<Button-1>", click)

root.mainloop()

引數

Text(master=None, **options) (class)

master -- 父元件

**options -- 元件選項,下方表格詳細列舉了各個選項的具體含義和用法:

選項 含義
autoseparators 1. 指定實現“撤銷”操作的時候是否自動插入一個“分隔符”(用於分隔操作記錄)
2. 預設值是 True
3. 詳見上方用法【“撤銷”和“恢復”操作】
background 1. 設定 Text 元件的背景顏色
2. 注意:通過使用 Tags 可以使 Text 元件中的文字支援多種背景顏色顯示(請參考上方【Tags 用法】)
bg 跟 background 一樣
borderwidth 1. 設定 Entry 的邊框寬度
2. 預設值是 1 畫素
bd 跟 borderwidth 一樣
cursor 1. 指定當滑鼠在 Text 元件上飄過的時候的滑鼠樣式
2. 預設值由系統指定
exportselection 1. 指定選中的文字是否可以被複制到剪貼簿
2. 預設值是 True
3. 可以修改為 False 表示不允許複製文字
font 1. 設定 Text 元件中文字的預設字型
2. 注意:通過使用 Tags 可以使 Text 元件中的文字支援多種字型顯示(請參考上方【Tags 用法】)
foreground 1. 設定 Text 元件中文字的顏色
2. 注意:通過使用 Tags 可以使 Text 元件中的文字支援多種顏色顯示(請參考上方【Tags 用法】)
fg 跟 foreground 一樣
height 1. 設定 Text 元件的高度
2. 注意:單位是行數,不是畫素噢
highlightbackground 1. 指定當 Text 元件沒有獲得焦點的時候高亮邊框的顏色
2. 預設值由系統指定
highlightcolor 1. 指定當 Text 元件獲得焦點的時候高亮邊框的顏色
2. 預設值由系統指定
highlightthickness 1. 指定高亮邊框的寬度
2. 預設值是 0
insertbackground 1. 設定插入游標的顏色
2. 預設是 BLACK(或 "black")
insertborderwidth 1. 設定插入游標的邊框寬度
2. 預設值是 0
3. 提示:你得設定 insertwidth 選項為比較大的數值才能看出來噢
insertofftime 1. 該選項控制游標的閃爍頻率(滅)
2. 單位是毫秒
insertontime 1. 該選項控制游標的閃爍頻率(亮)
2. 單位是毫秒
insertwidth 1. 指定游標的寬度
2. 預設值是 2 畫素
maxundo 1. 設定允許“撤銷”操作的最大次數
2. 預設值是 0
3. 設定為 -1 表示不限制
padx 1. 指定水平方向上的額外間距(內容和邊框間)
2. 預設值是 1
pady 1. 指定垂直方向上的額外間距(內容和邊框間)
2. 預設值是 1
relief 1. 指定邊框樣式
2. 預設值是 "sunken"
3. 其他可以選擇的值是 "flat","raised","groove" 和 "ridge"
selectbackground 1. 指定被選中文字的背景顏色
2. 預設值由系統指定
selectborderwidth 1. 指定被選中文字的邊框寬度
2. 預設值是 0
selectforeground 1. 指定被選中文字的字型顏色
2. 預設值由系統指定
setgrid 1. 指定一個布林型別的值,確定是否啟用網格控制
2. 預設值是 False
spacing1 1. 指定 Text 元件的文字塊中每一行與上方的空白間隔
2. 注意:自動換行不算
3. 預設值是 0
spacing2 1. 指定 Text 元件的文字塊中自動換行的各行間的空白間隔
2. 注意:換行符('\n')不算
3. 預設值是 0
spacing3 1. 指定 Text 元件的文字中每一行與下方的空白間隔 
2. 注意:自動換行不算
3. 預設值是 0
state 1. 預設情況下 Text 元件響應鍵盤和滑鼠事件("normal")
2. 如果將該選項的值設定為 "disabled",那麼上述響應就不會發生,並且你無法修改裡邊的內容
tabs 1. 定製 Tag 所描述的文字塊中 Tab 按鍵的功能
2. 預設 Tab 被定義為 8 個字元的寬度
3. 你還可以定義多個製表位:tabs=('3c', '5c', '12c') 表示前 3 個 Tab 寬度分別為 3釐米,5釐米,12釐米,接著的 Tab 按照最後兩個的差值計算,即:19釐米,26釐米,33釐米
4. 你應該注意到了,它上邊 'c' 的含義是“釐米”而不是“字元”,還可以選擇的單位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大約是 '1i' 等於 '72p')
5. 如果是一個整型值,則單位是畫素
takefocus 1. 指定使用 Tab 鍵可以將焦點移動到 Text 元件中
2. 預設是開啟的,可以將該選項設定為 False 避免焦點在此 Text 元件中
undo 1. 該選項設定為 True 開啟“撤銷”功能
2. 該選項設定為 False 關閉“撤銷”功能
3. 預設值是 False
width 1. 設定 Text 元件的寬度
2. 注意:單位是字元數,因此 Text 元件的實際寬度還取決於字型的大小
wrap 1. 設定當一行文字的長度超過 width 選項設定的寬度時,是否自動換行
2. 該選項的值可以是:"none"(不自動換行),"char"(按字元自動換行)和 "word"(按單詞自動換行)
xscrollcommand 1. 與 scrollbar(滾動條)元件相關聯(水平方向)
2. 使用方法可以參考:Scrollbar 元件
yscrollcommand 1. 與 scrollbar(滾動條)元件相關聯(垂直方向)
2. 使用方法可以參考: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) 一樣