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) 一樣