午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Tkinter 組件詳解(十一):Text...

 Bookroom for JetYang 2020-11-21

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

何時使用 Text 組件?

Text 組件用于顯示文本文檔,包含純文本或格式化文本(使用不同字體,嵌入圖片,顯示鏈接,甚至是帶 CSS 格式的 HTML 等)。因此,它常常也被用于作為簡單的文本編輯器和網(wǎng)頁瀏覽器使用。

用法

當你創(chuàng)建一個 Text 組件的時候,它里邊是沒有內(nèi)容的。為了給其插入內(nèi)容,你可以使用 insert() 方法以及 "insert" 或 "end" 索引號:

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root)
  4. text.pack()
  5. # "insert" 索引表示插入光標當前的位置
  6. text.insert("insert", "I love ")
  7. text.insert("end", "Python.com!")
  8. root.mainloop()

值得一提的是,Text 組件的 insert() 方法有一個可選的參數(shù),用于指定一個或多個“標簽”(標簽用于設(shè)置文本的格式,請參考下方【Tags 用法】)到新插入的文本中:

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=20, height=5)
  4. text.pack()
  5. # 設(shè)置 tag
  6. text.tag_config("tag_1", backgroun="yellow", foreground="red")
  7. # "insert" 索引表示插入光標當前的位置
  8. text.insert("insert", "I love ")
  9. text.insert("end", "FishC.com!", "tag_1")
  10. root.mainloop()

在 Text 組件中插入對象,可以使用 window_create() 和 image_create() 方法:

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=20, height=5)
  4. text.pack()
  5. text.insert("insert", "I love Python!")
  6. def show():
  7. print("哎呀,我被點了一下~")
  8. b1 = tk.Button(text, text="點我點我", command=show)
  9. text.window_create("insert", window=b1)
  10. root.mainloop()

刪除 Text 組件中的內(nèi)容可以用 delete() 方法,下邊代碼用于刪除所有內(nèi)容(也包含 window 和 image 對象,但不會刪除 marks 的內(nèi)容):

text.delete(1.0, "end")

刪除單獨一個字符(或者一個 window 對象,或者一個 image 對象),你可以僅使用一個參數(shù):

text.delete(b1)

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

獲得 Text 組件的內(nèi)容,可以使用 get() 方法(僅獲取文本內(nèi)容):

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

在下邊例子中,通過校檢 Text 組件中文本的 MD5 摘要來判斷內(nèi)容是否發(fā)生改變:

  1. import tkinter as tk
  2. import hashlib
  3. root = tk.Tk()
  4. text = tk.Text(root, width=20, height=5)
  5. text.pack()
  6. text.insert("insert", "I love Python.com!")
  7. contents = text.get(1.0, "end")
  8. def getSig(contents):
  9. m = hashlib.md5(contents.encode())
  10. return m.digest()
  11. sig = getSig(contents)
  12. def check():
  13. contents = text.get(1.0, "end")
  14. if sig != getSig(contents):
  15. print("警報:內(nèi)容發(fā)生變動!")
  16. else:
  17. print("風平浪靜~")
  18. tk.Button(root, text="檢查", command=check).pack()
  19. root.mainloop()

           

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

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=20, height=5)
  4. text.pack()
  5. print(text.index("insert"))
  6. text.insert("insert", "You are good!")
  7. print(text.index("insert"))
  8. root.mainloop()

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

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=20, height=5)
  4. text.pack()
  5. text.insert("insert", "You are good!")
  6. text.mark_set("here", '1.8')
  7. text.insert("here", "very ")
  8. root.mainloop()

最后,使用 search() 方法可以搜索 Text 組件中的內(nèi)容。你可以提供一個確切的目標進行搜索(默認),也可以使用 Tcl 格式的正則表達式進行搜索(需設(shè)置 regexp 選項為 True):

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=20, height=5)
  4. text.pack()
  5. text.insert("insert", "I love Python.com!")
  6. # 將任何格式的索引號統(tǒng)一為元組 (行,列) 的格式輸出
  7. def getIndex(text, index):
  8. return tuple(map(int, str.split(text.index(index), ".")))
  9. start = 1.0
  10. while True:
  11. pos = text.search("o", start, stopindex="end")
  12. if not pos:
  13. break
  14. print("找到啦,位置是:", getIndex(text, pos))
  15. start = pos + "+1c" # 將 start 指向下一個字符
  16. root.mainloop()

如果忽略 stopindex 選項,表示直到文本的末尾結(jié)束搜索。設(shè)置 backwards 選項為 True,則是修改搜索的方向(變?yōu)橄蚝笏阉鳎敲?start 變量你應(yīng)該設(shè)置為 END,stopindex 選項設(shè)置為 1.0,最后 "+1c" 改為 "-1c")

“恢復”和“撤銷”操作

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

通過設(shè)置 undo 選項為 True 可以開啟 Text 組件的“撤銷”功能。然后用 edit_undo() 方法實現(xiàn)“撤銷”操作,用 edit_redo() 方法實現(xiàn)“恢復”操作。

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

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=40, height=5, undo = True)
  4. text.pack()
  5. def move():
  6. text.edit_undo()
  7. tk.Button(root, text = "撤銷", command = move).pack()
  8. root.mainloop()

大概就是下圖這么回事

默認情況下,每一次完整的操作將會放入棧中。但怎么樣算是一次完整的操作呢?Tkinter 覺得每次焦點切換、用戶按下 Enter 鍵、刪除\插入操作的轉(zhuǎn)換等之前的操作算是一次完整的操作。也就是說你連續(xù)輸入“I love PythonP”的話,一次的“撤銷”操作就會將所有的內(nèi)容刪除。

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

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

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=40, height=5, autoseparators=False, undo=True, maxundo=10)
  4. text.pack()
  5. def callback(event):
  6. text.edit_separator()
  7. text.bind('<Key>', callback)
  8. text.insert("insert", "I love Python!")
  9. def move():
  10. text.edit_undo()
  11. tk.Button(root, text = "撤銷", command = move).pack()
  12. root.mainloop()

Indexes 用法

Indexes(索引)是用來指向 Text 組件中文本的位置,跟 Python 的序列索引一樣,Text 組件索引也是對應(yīng)實際字符之間的位置。

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"

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

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

指定超出現(xiàn)有文本的最后一行的行號,或超出一行中列數(shù)的列號都不會引發(fā)錯誤。對于這樣的指定,Tkinter 解釋為已有內(nèi)容的末尾的下一個位置。

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

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

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

"line.end"

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

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

 "insert"

對應(yīng)插入光標的位置。

"current"

對應(yīng)與鼠標坐標最接近的位置。不過,如果你緊按鼠標任何一個按鈕,它會直到你松開它才響應(yīng)。

"end"

對應(yīng) Text 組件的文本緩沖區(qū)最后一個字符的下一個位置。

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 的文本的最后一個字符之后)語法表示標簽的范圍。

  1. "%s.first" % tagname
  2. "%s.last" % tagname

如果查無此 tag,那么 Tkinter 會拋出一個TclError 異常。

selection(SEL_FIRST,SEL_LAST)

selection 是一個名為 SEL(或 "sel")的特殊 tag,表示當前被選中的范圍,你可以使用  SEL_FIRST 到 SEL_LAST 來表示這個范圍。如果沒有選中的內(nèi)容,那么 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,只需使用相應(yīng)的 PhotoImage 和 BitmapImage 對象。

expressions

expressions 用于修改任何格式的索引,用字符串的形式實現(xiàn)修改索引的表達式。

具體表達式實現(xiàn)如下:

表達式

含義

"+ 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. 單詞的定義是一系列字母、數(shù)字、下劃線或任何非空白字符的組合
3. 注意,使用該表達式前邊必須有一個空格隔開
" wordend"1. 將索引移動到當前索引指向的單詞的末尾
2. 單詞的定義是一系列字母、數(shù)字、下劃線或任何非空白字符的組合
3. 注意,使用該表達式前邊必須有一個空格隔開

TIPS:只要結(jié)果不產(chǎn)生歧義,關(guān)鍵字可以被縮寫,空格也可以省略。例如:"+ 5 chars" 可以簡寫成 "+5c"

在實現(xiàn)中,為了確保表達式為普通字符串,你可以使用 str 或格式化操作來創(chuàng)建一個表達式字符串。下邊例子演示了如何刪除插入光標前邊的一個字符:

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

Marks 用法

Marks(標記)通常是嵌入到 Text 組件文本中的不可見對象。事實上 Marks 是指定字符間的位置,并跟隨相應(yīng)的字符一起移動。Marks 有 "insert","current" 和 user-defined marks(用戶自定義的 Marks)。其中,"insert" 和 "current" 是 Tkinter 預定義的特殊 Marks,它們不能夠被刪除。

"insert" 用于指定當前插入光標的位置,Tkinter 會在該位置繪制一個閃爍的光標(因此并不是所有的 Marks 都不可見)。

 "current" 用于指定與鼠標坐標最接近的位置。不過,如果你緊按鼠標任何一個按鈕,它會直到你松開它才響應(yīng)。

你還可以自定義任意數(shù)量的 Marks,Marks 的名字是由普通字符串組成,可以是除了空白字符外的任何字符(為了避免歧義,你應(yīng)該起一個有意義的名字)。使用 mark_set() 方法創(chuàng)建和移動 Marks。

如果你在一個 Mark 標記的位置之前插入或刪除文本,那么 Mark 跟著一并移動。刪除 Marks 你需要使用 mark_unset() 方法,刪除 Mark 周圍的文本并不會刪除 Mark 本身。

如果有做相關(guān)練習的,應(yīng)該會被 Mark 的很多特性所疑惑,在準備這個內(nèi)容的時候也很是迷惑,找了不知多少文檔......最后總結(jié)為下邊幾個例子講解:

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

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

 

例2,如果 Mark 前邊的內(nèi)容發(fā)生改變,那么 Mark 的位置也會跟著移動(說白了就是 Mark 會“記住”它后邊的那貨~):

  1. text.insert("insert", "I love Python")
  2. text.mark_set("here", "1.2")
  3. text.insert("here", "插")
  4. text.insert("here", "入")

例3,如果 Mark 周圍的文本被刪除了,Mark 仍然還在噢(只是它后邊的那貨被刪除了,所以它六神無主,只能初始化為 "1.0"): 

  1. text.insert("insert", "I love Python")
  2. text.mark_set("here", "1.2")
  3. text.insert("here", "插")
  4. text.delete("1.0", "end")
  5. text.insert("here", "入")



例4,只有 mark_unset() 方法可以解除 Mark 的封?。?/p>

  1. text.insert("insert", "I love Python")
  2. text.mark_set("here", "1.2")
  3. text.insert("here", "插")
  4. text.mark_unset("here")
  5. text.delete("1.0", "end")
  6. text.insert("here", "入")



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

好,講最后一點,我們看到了,默認插入內(nèi)容到 Mark,是插入到它的左側(cè)(就是說插入一個字符的話,Mark 向后移動了一個字符的位置)。那能不能插入到 Mark 的右側(cè)呢?其實是可以的,通過 mark_gravity() 方法就可以實現(xiàn)。

例5(對比例2):

  1. text.insert("insert", "I love Python")
  2. text.mark_set("here", "1.2")
  3. text.mark_gravity("here", "left") #默認是 "right"
  4. text.insert("here", "插")
  5. text.insert("here", "入")

Tags 用法

Tags(標簽)通常用于改變 Text 組件中內(nèi)容的樣式和功能。你可以修改文本的字體、尺寸和顏色。另外,Tags 還允許你將文本、嵌入的組件和圖片與鍵盤和鼠標等事件相關(guān)聯(lián)。除了 user-defined tags(用戶自定義的 Tags),還有一個預定義的特殊 Tag:SEL。

SEL(或 "sel")用于表示對應(yīng)的選中內(nèi)容(如果有的話)。

你可以自定義任意數(shù)量的 Tags,Tags 的名字是由普通字符串組成,可以是除了空白字符外的任何字符。另外,任何文本內(nèi)容都支持多個 Tags 描述,任何 Tag 也可以用于描述多個不同的文本內(nèi)容。

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

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=40, height=5)
  4. text.pack()
  5. text.insert("insert", "I love Python.com!")
  6. text.tag_add("tag1", "1.7", "1.13", "1.15")
  7. text.tag_config("tag1", background="yellow", foreground="red")
  8. root.mainloop()

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

選項含義
background1. 指定該 Tag 所描述的內(nèi)容的背景顏色
2. 注意:bg 并不是該選項的縮寫,在這里 bg 被解釋為 bgstipple 選項的縮寫
bgstipple1. 指定一個位圖作為背景,并使用 background 選項指定的顏色填充
2. 只有設(shè)置了 background 選項該選項才會生效
3. 默認的標準位圖有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
borderwidth1. 指定文本框的寬度
2. 默認值是 0
3. 只有設(shè)置了 relief 選項該選項才會生效
4. 注意:該選項不能使用 bd 縮寫
fgstipple1. 指定一個位圖作為前景色
2. 默認的標準位圖有:'error', 'gray75', 'gray50', 'gray25', 'gray12', 'hourglass', 'info', 'questhead', 'question' 和 'warning'
font指定該 Tag 所描述的內(nèi)容使用的字體
foreground1. 指定該 Tag 所描述的內(nèi)容的前景色
2. 注意:fg 并不是該選項的縮寫,在這里 fg 被解釋為 fgstipple 選項的縮寫
justify1. 控制文本的對齊方式
2. 默認是 "left"(左對齊),還可以選擇 "right"(右對齊)和 "center"(居中)
3. 注意:需要將 Tag 指向該行的第一個字符,該選項才能生效
lmargin11. 設(shè)置 Tag 指向的文本塊第一行的縮進
2. 默認值是 0
3. 注意:需要將 Tag 指向該文本塊的第一個字符或整個文本塊,該選項才能生效
lmargin21. 設(shè)置 Tag 指向的文本塊除了第一行其他行的縮進
2. 默認值是 0
3. 注意:需要將 Tag 指向整個文本塊,該選項才能生效
offset

1. 設(shè)置 Tag 指向的文本相對于基線的偏移距離

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

如果你對同一個范圍內(nèi)的文本加上多個 Tags,并且設(shè)置相同的選項,那么新創(chuàng)建的 Tag 樣式會覆蓋比較舊的 Tag:

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=40, height=5)
  4. text.pack()
  5. text.tag_add("tag1", "1.7", "1.13", "1.15")
  6. text.tag_config("tag1", background="yellow", foreground="red") # 舊的 Tag
  7. text.tag_config("tag2", foreground="blue") # 新的 Tag
  8. # 那么新創(chuàng)建的 Tag2 會覆蓋比較舊的 Tag1 的相同選項
  9. # 注意,與下邊的調(diào)用順序沒有關(guān)系
  10. text.insert("insert", "I love Python.com!", ("tag2", "tag1"))
  11. root.mainloop()

你或許想控制 Tags 間的優(yōu)先級,這可以實現(xiàn)嗎?完全沒有問題!你可以使用 tag_raise() 和 tag_lower() 方法來提高和降低某個 Tag 的優(yōu)先級。

  1. import tkinter as tk
  2. root = tk.Tk()
  3. text = tk.Text(root, width=40, height=5)
  4. text.pack()
  5. text.tag_config("tag1", background="yellow", foreground="red")
  6. text.tag_config("tag2", foreground="green")
  7. text.tag_lower("tag2")
  8. text.insert("insert", "I love Python!", ("tag2", "tag1"))
  9. root.mainloop()

另外 Tags 還支持事件綁定,使用的是 tag_bind() 的方法。

下邊例子中我們將文本("Python.com")與鼠標事件進行綁定,當鼠標進入該文本段的時候,鼠標樣式切換為 "arrow" 形態(tài),離開文本段的時候切換回 "xterm" 形態(tài)。當觸發(fā)鼠標“左鍵點擊操作”事件的時候,使用默認瀏覽器打開Python的首頁(https://www./):

  1. import tkinter as tk
  2. import webbrowser
  3. root = tk.Tk()
  4. text = tk.Text(root, width=40, height=5)
  5. text.pack()
  6. text.insert("insert", "I love Python.com!")
  7. text.tag_add("link", "1.7", "1.17")
  8. text.tag_config("link", foreground = "blue", underline = True)
  9. def show_arrow_cursor(event):
  10. text.config(cursor = "arrow")
  11. def show_xterm_cursor(event):
  12. text.config(cursor = "xterm")
  13. def click(event):
  14. webbrowser.open("https://www./")
  15. text.tag_bind("link", "<Enter>", show_arrow_cursor)
  16. text.tag_bind("link", "<Leave>", show_xterm_cursor)
  17. text.tag_bind("link", "<Button-1>", click)
  18. root.mainloop()

參數(shù)

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

master -- 父組件

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

選項含義
autoseparators1. 指定實現(xiàn)“撤銷”操作的時候是否自動插入一個“分隔符”(用于分隔操作記錄)
2. 默認值是 True
3. 詳見上方用法【“撤銷”和“恢復”操作】
background1. 設(shè)置 Text 組件的背景顏色
2. 注意:通過使用 Tags 可以使 Text 組件中的文本支持多種背景顏色顯示(請參考上方【Tags 用法】)
bg跟 background 一樣
borderwidth1. 設(shè)置 Entry 的邊框?qū)挾?br> 2. 默認值是 1 像素
bd跟 borderwidth 一樣
cursor1. 指定當鼠標在 Text 組件上飄過的時候的鼠標樣式
2. 默認值由系統(tǒng)指定
exportselection1. 指定選中的文本是否可以被復制到剪貼板
2. 默認值是 True
3. 可以修改為 False 表示不允許復制文本
font1. 設(shè)置 Text 組件中文本的默認字體
2. 注意:通過使用 Tags 可以使 Text 組件中的文本支持多種字體顯示(請參考上方【Tags 用法】)
foreground1. 設(shè)置 Text 組件中文本的顏色
2. 注意:通過使用 Tags 可以使 Text 組件中的文本支持多種顏色顯示(請參考上方【Tags 用法】)
fg跟 foreground 一樣
height1. 設(shè)置 Text 組件的高度
2. 注意:單位是行數(shù),不是像素噢
highlightbackground1. 指定當 Text 組件沒有獲得焦點的時候高亮邊框的顏色
2. 默認值由系統(tǒng)指定
highlightcolor1. 指定當 Text 組件獲得焦點的時候高亮邊框的顏色
2. 默認值由系統(tǒng)指定
highlightthickness1. 指定高亮邊框的寬度
2. 默認值是 0
insertbackground1. 設(shè)置插入光標的顏色
2. 默認是 BLACK(或 "black")
insertborderwidth1. 設(shè)置插入光標的邊框?qū)挾?br> 2. 默認值是 0
3. 提示:你得設(shè)置 insertwidth 選項為比較大的數(shù)值才能看出來噢
insertofftime1. 該選項控制光標的閃爍頻率(滅)
2. 單位是毫秒
insertontime1. 該選項控制光標的閃爍頻率(亮)
2. 單位是毫秒
insertwidth1. 指定光標的寬度
2. 默認值是 2 像素
maxundo1. 設(shè)置允許“撤銷”操作的最大次數(shù)
2. 默認值是 0
3. 設(shè)置為 -1 表示不限制
padx1. 指定水平方向上的額外間距(內(nèi)容和邊框間)
2. 默認值是 1
pady1. 指定垂直方向上的額外間距(內(nèi)容和邊框間)
2. 默認值是 1
relief1. 指定邊框樣式
2. 默認值是 "sunken"
3. 其他可以選擇的值是 "flat","raised","groove" 和 "ridge"
selectbackground1. 指定被選中文本的背景顏色
2. 默認值由系統(tǒng)指定
selectborderwidth1. 指定被選中文本的邊框?qū)挾?br> 2. 默認值是 0
selectforeground1. 指定被選中文本的字體顏色
2. 默認值由系統(tǒng)指定
setgrid1. 指定一個布爾類型的值,確定是否啟用網(wǎng)格控制
2. 默認值是 False
spacing11. 指定 Text 組件的文本塊中每一行與上方的空白間隔
2. 注意:自動換行不算
3. 默認值是 0
spacing21. 指定 Text 組件的文本塊中自動換行的各行間的空白間隔
2. 注意:換行符('\n')不算
3. 默認值是 0
spacing31. 指定 Text 組件的文本中每一行與下方的空白間隔 
2. 注意:自動換行不算
3. 默認值是 0
state1. 默認情況下 Text 組件響應(yīng)鍵盤和鼠標事件("normal")
2. 如果將該選項的值設(shè)置為 "disabled",那么上述響應(yīng)就不會發(fā)生,并且你無法修改里邊的內(nèi)容
tabs1. 定制 Tag 所描述的文本塊中 Tab 按鍵的功能
2. 默認 Tab 被定義為 8 個字符的寬度
3. 你還可以定義多個制表位:tabs=('3c', '5c', '12c') 表示前 3 個 Tab 寬度分別為 3厘米,5厘米,12厘米,接著的 Tab 按照最后兩個的差值計算,即:19厘米,26厘米,33厘米
4. 你應(yīng)該注意到了,它上邊 'c' 的含義是“厘米”而不是“字符”,還可以選擇的單位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大約是 '1i' 等于 '72p')
5. 如果是一個整型值,則單位是像素
takefocus1. 指定使用 Tab 鍵可以將焦點移動到 Text 組件中
2. 默認是開啟的,可以將該選項設(shè)置為 False 避免焦點在此 Text 組件中
undo1. 該選項設(shè)置為 True 開啟“撤銷”功能
2. 該選項設(shè)置為 False 關(guān)閉“撤銷”功能
3. 默認值是 False
width1. 設(shè)置 Text 組件的寬度
2. 注意:單位是字符數(shù),因此 Text 組件的實際寬度還取決于字體的大小
wrap1. 設(shè)置當一行文本的長度超過 width 選項設(shè)置的寬度時,是否自動換行
2. 該選項的值可以是:"none"(不自動換行),"char"(按字符自動換行)和 "word"(按單詞自動換行)
xscrollcommand1. 與 scrollbar(滾動條)組件相關(guān)聯(lián)(水平方向)
2. 使用方法可以參考:Scrollbar 組件
yscrollcommand1. 與 scrollbar(滾動條)組件相關(guān)聯(lián)(垂直方向)
2. 使用方法可以參考:Scrollbar 組件

方法

bbox(index)
-- 返回給定索引指定的字符的邊界框
-- 返回值是一個 4 元組:(x, y, width, height)
-- 如果該字符是不可見的,那么返回 None
-- 注意:只有當 Text 組件被更新的時候該方法才有效,可以使用 update_idletasks() 方法先更新 Text 組件

compare(index1, op, index2)
-- 返回對比 index1 和 index2 指定的兩個字符的結(jié)果
-- op 是操作符:'<', '<=', '==', '>=', '>' 或 '!='(不支持 Python 的 '<>' 操作符)
-- 返回布爾類型的值表示對比的結(jié)果

debug(boolean=None)
-- 開啟或關(guān)閉 Debug 狀態(tài)

delete(start, end=None)
-- 刪除給定范圍的文本或嵌入對象
-- 如果在給定范圍內(nèi)有任何 Marks 標記的位置,則將 Marks 移動到 start 參數(shù)開始的位置

dlineinfo(index)
-- 返回給定索引指定的字符所在行的邊界框
-- 返回值是一個 5 元組:(x, y, width, height, offset),offset 表示從該行的頂端到基線的偏移
-- 如果該行不可見,則返回 None
-- 注意:只有當 Text 組件被更新的時候該方法才有效,可以使用 update_idletasks() 方法先更新 Text 組件

dump(index1, index2=None, command=None, **kw)
-- 返回 index1 和 index2 之間的內(nèi)容
-- 返回的值是一個由 3 元組(關(guān)鍵詞,值,索引)組成的列表,關(guān)鍵詞參數(shù)的順序為:all, image, mark, tag, text, window
-- 默認關(guān)鍵詞是 'all',表示全部關(guān)鍵詞均為選中狀態(tài)
-- 如果需要篩選個別關(guān)鍵詞,可以用 dump(index1, index2, image=True, text=True) 這樣的形式調(diào)用
-- 如果指定了 command 函數(shù),那么會為列表中的每一個三元組作為參數(shù)調(diào)用一次該函數(shù)(這種情況下,dump() 不返回值)

edit_modified(arg=None)
-- 該方法用于查詢和設(shè)置 modified 標志(該標標志用于追蹤 Text 組件的內(nèi)容是否發(fā)生變化)
-- 如果不指定 arg 參數(shù),那么返回 modified 標志是否被設(shè)置
-- 你可以傳遞顯式地使用 True 或 False 作為參數(shù)來設(shè)置或清除 modified 標志
-- 任何代碼或用戶的插入或刪除文本操作,“撤銷”或“恢復”操作,都會是的 modified 標志被設(shè)置

edit_redo(self)
-- “恢復”上一次的“撤銷”操作
-- 如果 undo 選項為 False,該方法無效
-- 詳見上方用法【“撤銷”和“恢復”操作】

edit_reset()
-- 清空存放操作記錄的棧

edit_separator()
-- 插入一個“分隔符”到存放操作記錄的棧中,用于表示已經(jīng)完成一次完整的操作
-- 如果 undo 選項為 False,該方法無效
-- 詳見上方用法【“撤銷”和“恢復”操作】

edit_undo()
-- 撤銷最近一次操作
-- 如果 undo 選項為 False,該方法無效
-- 詳見上方用法【“撤銷”和“恢復”操作】

get(index1, index2=None)
-- 返回 index1 到 index2(不包含)之間的文本
-- 如果 index2 參數(shù)忽略,則返回一個字符
-- 如果包含 image 和 window 的嵌入對象,均被忽略
-- 如果包含有多行文本,那么自動插入換行符('\n')

image_cget(index, option)
-- 返回 index 參數(shù)指定的嵌入 image 對象的 option 選項的值
-- 如果給定的位置沒有嵌入 image 對象,則拋出 TclError 異常

image_configure(index, **options)
-- 修改 index 參數(shù)指定的嵌入 image 對象的一個或多個 option 選項的值
-- 如果給定的位置沒有嵌入 image 對象,則拋出 TclError 異常

image_create(index, cnf={}, **kw)
-- 在 index 參數(shù)指定的位置嵌入一個 image 對象
-- 該 image 對象必須是 Tkinter 的 PhotoImage 或 BitmapImage 實例
-- 可選選項 align:設(shè)定此圖像的垂直對齊,可以是 "top"、"center"、"bottom" 或 "baseline"
-- 可選選項 image:PhotoImage 或 BitmapImage 對象
-- 可選選項 name:你可以為該圖像實例命名,如果你忽略此選項,那么 Tkinter 會自動為其取一個獨一無二的名字。
-- 可選選項 padx:設(shè)置水平方向上的額外間距
-- 可選選項 pady:設(shè)置垂直方向上的額外間距

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

index(index)
-- 將 index 參數(shù)指定的位置以 "line.column" 的索引形式返回
-- index 參數(shù)支持任何格式的索引

insert(index, text, *tags)
-- 在 index 參數(shù)指定的位置插入字符串
-- 可選參數(shù) tags 用于指定文本的樣式
-- 詳見上方【Tags 用法】

mark_gravity(self, markName, direction=None)
-- 設(shè)置 Mark 的方向,可以是 "left" 或 "right"(默認是 "right",即如果在 Mark 處插入文本的話,Mark 將發(fā)生相應(yīng)的移動以保持在插入文本的右側(cè))
-- 如果設(shè)置為 "left",那么在 Mark 處插入文本并不會移動 Mark(因為 Mark 在插入文本的左側(cè))
-- 如果忽略 direction 參數(shù),則返回指定 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 參數(shù)指定的位置
-- 如果 markName 參數(shù)指定的 Mark 不存在,則創(chuàng)建一個新的 Mark

mark_unset(*markNames)
-- 刪除 markNames 指定的 Marks
-- 不能刪除預定義的 "insert" 和 "current"

replace(index1, index2, chars, *args)
-- 將 index1 到 index2 之間的內(nèi)容替換為 chars 參數(shù)指定的字符串
-- 如果需要為替換的內(nèi)容添加 Tag,可以在 args 參數(shù)指定 Tag
-- 詳見上方【Tags 用法】

scan_dragto(x, y)
-- 詳見下方 scan_mark(x, y)

scan_mark(x, y)
-- 使用這種方式來實現(xiàn) Text 組件內(nèi)容的滾動
-- 需要將鼠標按鈕事件以及鼠標當前位置綁定到 scan_mark(x, y) 方法,然后將 <motion> 事件及當前鼠標位置綁定到 scan_dragto(x, y) 方法,就可以實現(xiàn) Text 組件的內(nèi)容在當前位置和 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 結(jié)束(不指定表示搜索到末尾)
-- 如果成功找到,以 "line.column" 返回第一個匹配的字符;否則返回空字符串
-- forwards 參數(shù)設(shè)置為 True 表示向前(->)搜索
-- backwards 參數(shù)設(shè)置為 True 表示向后(<-)搜索
-- exact 參數(shù)設(shè)置為 True 表示搜索與 pattern 完全匹配的結(jié)果
-- regexp 參數(shù)設(shè)置為 True,則 pattern 被解釋為 Tcl 格式的正則表達式
-- nocase 參數(shù)設(shè)置為 True 是忽略大小寫,默認是區(qū)分大小寫的搜索
-- count 參數(shù)指定為一個 IntVar 的 Tkinter 變量,用于存放當找到匹配的字符個數(shù)(如果匹配結(jié)果中沒有嵌入的 image 或 window 對象的話,一般該值等于 pattern 的字符個數(shù))

see(index)
-- 滾動內(nèi)容,確保 index 指定的位置可見

tag_add(tagName, index1, index2=None)
-- 為 index1 到 index2 之間的內(nèi)容添加一個 Tag(tagName 參數(shù)指定)
-- 如果 index2 參數(shù)忽略,則單獨為 index1 指定的內(nèi)容添加 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)
-- 設(shè)置 tagName 的選項
-- 詳見上方【Tags 用法】

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

tag_lower(tagName, belowThis=None)
-- 降低 Tag 的優(yōu)先級
-- 如果 belowThis 參數(shù)不為空,則表示 tagName 需要比 belowThis 指定的 Tag 優(yōu)先級更低
-- 詳見上方【Tags 用法】

tag_names(index=None)
-- 如果不帶參數(shù),表示返回 Text 組件中所有 Tags 的名字
-- index 參數(shù)表示返回該位置上所有的 Tags 的名字

tag_nextrange(tagName, index1, index2=None)
-- 在 index1 到 index2 的范圍內(nèi)第一個 tagName 的位置
-- 如果沒有則返回空字符串

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

tag_raise(tagName, aboveThis=None)
-- 提高 Tag 的優(yōu)先級
-- 如果 aboveThis 參數(shù)不為空,則表示 tagName 需要比 aboveThis 指定的 Tag 優(yōu)先級更高
-- 詳見上方【Tags 用法】

tag_ranges(tagName)
-- 返回所有 tagName 指定的文本,并將它們的范圍以列表的形式返回

tag_remove(tagName, index1, index2=None)
-- 刪除 index1 到 index2 之間所有的 tagName
-- 如果忽略 index2 參數(shù),那么只刪除 index1 指定的那個字符的 tagName(如果有的話)

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

window_cget(index, option)
-- 返回 index 參數(shù)指定的嵌入 window 對象的 option 選項的值
-- 如果給定的位置沒有嵌入 window 對象,則拋出 TclError 異常

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

window_configure(index, cnf=None, **kw)
-- 修改 index 參數(shù)指定的嵌入 window 對象的一個或多個 option 選項的值
-- 如果給定的位置沒有嵌入 window 對象,則拋出 TclError 異常

window_create(index, **options)
-- 在 index 參數(shù)指定的位置嵌入一個 window 對象
-- 支持兩種方式在 Text 組件中嵌入 window 對象:請看下方 create 選項和 window 選項的描述
-- 可選選項 align:設(shè)定此圖像的垂直對齊,可以是 "top"、"center"、"bottom" 或 "baseline"
-- 可選選項 create:指定一個回調(diào)函數(shù)用于創(chuàng)建嵌入的 window 組件,該函數(shù)沒有參數(shù),并且必須創(chuàng)建 Text 的子組件并返回
-- 可選選項 padx:設(shè)置水平方向上的額外間距
-- 可選選項 pady:設(shè)置垂直方向上的額外間距
-- 可選選項 stretch:該選項控制當行的高度大于嵌入組件的高度時,嵌入組件是否延伸。默認值是 False,表示組件保持原形;設(shè)置為 True 表示將該組件垂直部分延伸至行的高度
-- 可選選項 window:指定一個已經(jīng)創(chuàng)建好的 window 組件,該組件必須是 Text 組件的子組件

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

xview(*args)
-- 該方法用于在水平方向上滾動 Text 組件的內(nèi)容,一般通過綁定 Scollbar 組件的 command 選項來實現(xiàn)(具體操作參考:Scrollbar
-- 如果第一個參數(shù)是 "moveto",則第二個參數(shù)表示滾動到指定的位置:0.0 表示最左端,1.0 表示最右端
-- 如果第一個參數(shù)是 "scroll",則第二個參數(shù)表示滾動的數(shù)量,第三個參數(shù)表示滾動的單位(可以是 "units" 或 "pages"),例如:xview("scroll", 3, "units") 表示向右滾動三行

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

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

yview(*args)
-- 該方法用于在垂直方向上滾動 Text 組件的內(nèi)容,一般通過綁定 Scollbar 組件的 command 選項來實現(xiàn)(具體操作參考:Scrollbar
-- 如果第一個參數(shù)是 "moveto",則第二個參數(shù)表示滾動到指定的位置:0.0 表示最頂端,1.0 表示最底端
-- 如果第一個參數(shù)是 "scroll",則第二個參數(shù)表示滾動的數(shù)量,第三個參數(shù)表示滾動的單位(可以是 "units" 或 "pages"),例如:yview("scroll", 3, "pages") 表示向下滾動三頁

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

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約