Tkinter (19) 文字部件 Text

Jason990420發表於2020-08-18

文字部件的建立及其選項

部件主要作為處理多行字串, 更可作為文字編輯器, 可以混合不同字型, 顏色, 圖片(圖片被視為單一字元處理), 也可以在文字部件中嵌入其他的部件, 該部件也被視為單一的字元.

text = tk.Text(parent, option, ...)
選項 說明
autoseparators undo=True 時, 是否在每次插入或刪除後自動將分隔符新增到 undo 堆疊
bg or background 預設背景色
bd or borderwidth 外框的寛度, 內定為 2 點素
cursor 當滑鼠移到部件處時,所顯示的滑鼠圖示
exportselection 文字可否複製到剪貼簿 0/1
font 預設文字字型
fg or foreground 預設文字及點陣圖的顏色
height 根據 font 選項的行數
highlightbackground 非聚焦時的聚焦顏色
highlightcolor 聚焦時的聚焦顏色
highlightthickness 聚焦厚度,內定 1, 0 則無
insertbackground 插入游標的背景顏色,內定為黑色
insertborderwidth 插入游標外框寛度,內定為 0
insertofftime 插入游標消失的時間,內定為 300 ms
insertontime 插入游標顯現的時間,內定為 600 ms
insertwidth 插入游標寛度,內定為 2 點素
maxundo 設定 undo 堆疊的最大保留次數, -1 為不限次數
padx 水平間距,內定為 1 點素
pady 垂直間距,內定為 1 點素
relief 外框花樣,內定為 SUNKEN
selectbackground 被選擇文字的背景顏色
selectborderwidth 被選擇文字的外框寛度
selectforeground 被選擇文字的前景顏色
spacing1 段落前距, 內定 0 點素
spacing2 段落中距, 內定 0 點素
spacing3 段落後距, 內定 0 點素
state NORMAL 或 DISABLED
tabs 定位符位置
takefocus TAB 鍵在部件是否會迴圈焦點 0/1
undo 是否可以 undo
width 部件的寛度 (標準字寛)
wrap 換行的方法, 內定為 CHAR, WORD, NONE
xscrollcommand 水平捲軸 scrollbar.set () 方法
yscrollcommand 垂直捲軸 scrollbar.set () 方法

文字部件的索引方式

索引 index 指連續兩個字元中間的位置, 以字串代表值.

選項 說明
line.column 字串, 第line行 (從 1 開始), 第column位置 (從 0 開始)
line.end 字串, 第 line 行最後處
tk.INSERT 插入游標位置, 同 ‘insert’
tk.CURRENT 最近滑鼠位置, 同 ‘current’
tk.END 文字最後的位置, 同 ‘end’
tk.SEL_FIRST 選擇區的起點, 同 ‘sel.first’
tk.SEL_LAST 選擇區的終點, 同 ‘sel.last’
markname 字串, 使用標記名的標記的位置
tag.first 字串, 標籤的起點
tag.last 字串, 標籤的終點
@x,y 字串, 最接近座標位置 (x, y) 的字元前
embedded-object 內嵌部件前

注: 以下內容可以加入以上索引, 取得更復雜的索引方式, 空格可省略, 可跨行.

選項 說明
+ n chars(c) 向後 n 個字元
- n chars(c) 向前 n 個字元
+ n lines(l) 向上 n 行, 如果長度不夠, 會在行尾
- n lines(l) 向下 n 行, 如果長度不夠, 會在行尾
linestart 行前
lineend 行後
wordstart 索引所在的字前

文字部件的標記 (mark)

標記為一不含句點及空格的字串, 用來代表一個索引值, 比如 tk.INSERT, tk.CURRENT. 如果內文修改不影響標記相鄰部份, 標記的位置不會改變.
標記有個定位方式 Gravity, 可以是 tk.LEFT 或 tk.RIGHT, 在標記處插入新字串時, 前者標記保留在左側, 後者則標記保留在右側.
刪除含有標記的字串, 不會刪除標記.

文字部件的標籤 (tag)

標籤tag 用來代表具有某些相同選項(如字型, 顏色, 事件等) 專案不含句點及空格的字串, 用來代表某一群具有某些同樣選項的專案, 比如tk.SEL 代表被選擇的文字專案.
每個專案可以對應多個標籤, 同樣標籤也可以對應多個專案, 如果不同的標籤對應到同一個專案, 其選項的設定不同, 因為標籤是以堆疊方式來管理, 因此以後設的標籤選項而定.

文字部件的定位符

內定的定位符位置是8 個字元, 自定例如tabs=(‘3c’, ‘5c’, ‘12c’), 後面的所有定位符位置將是同距於定位符間的最後一個距離(12c - 5c = 7c)
內定的定位方式是左邊對齊tk.LEFT, 也是可是tk.RIGHT, tk.CENTER, tk.NUMERIC (小數點對齊), 例如tabs=(‘3c’, ‘5c’, tk.RIGHT, ‘12c’, tk.CENTER)

文字部件的方法

方法 說明
bbox(index) 取得輸入區字串索引index 所在的字元,左上角的座標(x, y), 寛度/ 高度w/h, 返回(x, y, w, h), 如果沒有字則返回None, 如果未更新update_idletasks(), 可能不會取得準確的資訊
compare(index1, op, index2) 比較兩個索引的位置, op 為 ‘<’, ‘<=’, ‘==’, ‘!=’, ‘>=’, or ‘>’
delete(index1, index2=None) 刪除索引 index1 處的字元, 或 index1 處到 index2 處前的字串
dlineinfo(index) 取得索引index 所在的行,左上角的座標(x, y), 寛度/ 高度w/h, 返回(x, y, w, h), 如果沒有字則返回None,如果未更新update_idletasks(), 可能不會取得準確的資訊
edit_modified(arg=None) 無引數返回, True 設定, False 清除文字修改的旗標, 旗標以部件內容有無修改為準
edit_redo() 執行 redo
edit_reset() 清除 undo 堆疊
edit_separator() 放一個 seperator 進堆疊, 用來界定下一個 undo 的還原步驟範圍
edit_undo() 執行 undo (所有上回放入 seperator 後的改變, 如果沒有 seperator, 則 undo 全部), 空的 undo 堆疊會引起錯誤
image_create(index[, option=value, …]) 在索引的地方插入圖片, 選項有
align 垂直對齊位置top/center/bottom/baseline (文字的底線)
image 圖片< br>name 圖片的名稱, 沒有設定會產生為#number
padx 左右間隔
pady 上下間隔
get(index1, index2=None) 返回索引index1 處的字元, 或index1 處到index2 處前的字串, 其中的圖片及部件都會被省略, 只返回文字部份, 多行以’\n’來表示
image_cget(index, option) 返回索引所指圖片的某選項值
image_configure(index, option, …) 設定索引所指圖片的各選項值, 無選項則返回選項值的字典
image_names() 返回文字部件中所有圖片的名稱 tuple
index(i) 返回相關位置的索引值’line.char’, 引數有END (行末), INSERT (插入點), ANCHOR, SEL_FIRST (前選擇點), SEL_LAST (後選擇點), “@x ”(近x 處)
insert(index, text, *tags) 在索引處插入字串, 加入 tags 標籤中, 在插入處前後文字的標籤都會被忽略; 如果沒有給標籤, 則會被加上去
mark_gravity(mark, gravity=None) 設定或返回一個標記 mark 的定位方式 gravity, tk.LEFT 或 tk.RIGHT
mark_names() 返回文字部件中所有的標記名稱, 包含 tk.INSERT 及 tk.CURRENT
mark_next(index) 返回索引處後的標記名稱, 無則返回空符; 如果索引是一個數值, 返回的是在該位置的第一個標記, 如是索引是一個標記, 則返回下一個標記,該標記可能會是在同一個數值位置
mark_previous(index) 返回索引處前的標記名稱, 無則返回空符; 如果索引是一個數值, 返回的是在該位置的最後一個標記, 如是索引是一個標記, 則返回前一個標記, 該標記可能會是在同一個數值位置
mark_set(mark, index) 設定在索引處的標記, 如果是新的標記, 將具有tk.RIGHT 的定位方式, 如果是已有的標記, 將會移到該新的位置, 這個方法可能會改變tk.INSERT/tk.CURRENT 的位置
mark_unset(mark) 移除標記名, 不含 tk.INSERT 及 tk.CURRENT
scan_dragto(x, y) 滑鼠鍵按下事件處理程式中已標記位置時, 滑鼠滾動事件處理程式拖弋捲動部件, (x, y) 為位置
scan_mark(x, y) 滑鼠鍵按下事件處理程式中標記位置 (x, y)
search(pattern, index, option, …) 按pattern (字串或正則式) 從索引處開始搜尋, 如果成功, 返回’line.char’, 否則返回空字元
選項有:
backwards - 反向搜尋嗎, 內定為False
count - tk.IntVar() 用來使用該變數的get() 方法, 得到符合pattern 的字串長度
exact - 設定True 使搜尋必須完全符合
forwards - 設定正向搜尋, 內定為True
regexp - 設True 以使用Tcl 式的正則式, 內定為完全匹配, Tcl 式為python 正則式的字集, 支援. ^ [c1 …] (…) * + ? e1|e2
see(index) 捲動部件, 使索引位置可見
tag_add(tagName, index1, index2=None) 關連標籤名 tagName 到索引 index1 處的字元, 或 index1 處到 index2 處前的字串
tag_bind(tagName, sequence, func, add=None) 繫結標籤tagName 的事件sequence 到回撥函式func, add ‘+’ 為增加新的函式, 否則為取代所有舊的函式; 只有前兩個引數,則返回事件相關的函式; 只有第一個引數, 則返回所有相關函式的列表
tag_cget(tagName, option) 返回標籤的選項值
tag_config(tagName, option, …) 設定各選項的值, 沒選項時, 則以字典的方式返回全部的選項值
選項如下
background - 背景色, 不能使用bg
bgstipple - 在設定背景色的情況下, 為使背景可以顯示灰化, 設定為一個標準的點陣圖名
borderwidth - 標籤所代表的文字外框寛度, 內定為0, 不能使用bd
fgstipple - 為使前景可以顯示灰化, 設定為一個標準的點陣圖名
font - 文字的字型
foreground - 前景色, 不能使用fg
justify - 多行文字的對齊方式,LEFT (內定) /RIGHT/CENTER
lmargin1 - 第一行的縮格, 內定為0
lmargin2 - 其他行的縮格, 內定為0
offset - 文字上移(正值)或下移(負值)量, 以文字的基準線為參考點, 比如上標或下標
overstrike - 是否畫上文字的水平中線, 比如刪除線
relief - 花邊樣式, 內定為FLAT
rmargin - 右邊的縮格量, 內定為0
spacing1 - 前垂直間距, 內定為0
spacing2 - 內垂直間距, 內定為0
spacing3 - 後垂直間距, 內定為0
tabs - 設定定位符的位置
underline - True 設定下底線
wrap - 換行的長度
tag_delete(tagName, …) 刪除標籤名, 其相關的繫結, 選項, 字串的關連性都會移除
tag_lower(tagName, belowThis=None) 下移標籤 tagName 至 belowThis 標籤下方, 無 belowThis, 則移到標籤堆疊的最下方
tag_names(index=None) 返回索引處所有相關的標籤名, 或者文字部件內所有的標籤名
tag_nextrange(tagName, index1, index2=None) 從索引index1 開始到index2 (或到文字結束處), 如果存在tagName 標籤, 返回(i0, i1), i0 為第一個起始位置, i1 為最後一個結束位置. 沒有則返回空字元
tag_prevrange(tagName, index1, index2=None) 從索引index1 之前到index2 (或到文字結束處), 如果存在tagName 標籤, 返回(i0, i1), i0 為第一個起始位置, i1 為最後一個結束位置. 沒有則返回空字元
tag_raise(tagName, aboveThis=None) 上移標籤 tagName 至 aboveThis 標籤上方, 無 aboveThis, 則移到標籤堆疊的最上方
tag_ranges(tagName) 返回標籤名所有的文字位置列表 [s0, e0, s1, e1, …], si 為索引起點, ei 為索引終點
tag_remove(tagName, index1, index2=None) 移除從索引 index1 (到 index2) 的標籤名 tagName
tag_unbind(tagName, sequence, funcid=None) 移除標籤名的繫結事件回撥函式
window_cget(index, option) 返回嵌入文字中索引處部件的選項值
window_configure(index, option) 設定嵌入文字中索引處部件的各選項值, 或返回全部選項的字典值
window_create(index, option, …) 在索引處建立部件及其選項值, 或使用回撥來建立部件
選項有
align - 設定部件垂直的定位, CENTER (內定), TOP , BOTTOM, BASELINE
create - 建立子部件的無引數回撥函式, 該部件必須是文字部件的子部件, 該函式返回該子部件
padx - 子部件左右間隔, 內定為0
pady - 子部件上下間隔, 內定為0
stretch - 如果行高比子部件高, 是否拉長子部件, 內定為0, 1 則為拉長, 而且align 選項將為無效
window - 嵌入文字中的子部件, 該部件必須是文字部件的子部件
window_names() 返回文字部件中所有子部件的名稱列表
xview(tk.MOVETO, fraction) 供水平捲軸 scrollbar 選項 command 使用,fraction 0.0 為最左處, 1.0 為右處
xview(tk.SCROLL, n, what) 水平滾動畫布 n 個單位,單位 what 為 tk.UNITS (字元) 或 tk.PAGES (頁)
xview_moveto(fraction) 同 xview (tk.MOVETO, fraction)
xview_scroll(n, what) 同 xview (tk.SCROLL, n, what)
yview(tk.MOVETO, fraction) 垂直滾動畫布,類似 xview (tk.MOVETO,…)
yview(tk.SCROLL, n, what) 垂直滾動畫布,類似 xview (tk.SCROLL,…), tk.UNITS (行數)
yview_moveto(fraction) 垂直滾動畫布,類似 xview_moveto()
yview_scroll(n, what) 垂直滾動畫布,類似 xview_scroll ()

範例視窗及程式碼

Python

import tkinter as tk

def add_text(widget, sequence):
    global tags
    for i, (font, paragraph, color) in enumerate(sequence):
        tags[i]=f'tag_{i}'
        widget.insert(tk.END, paragraph+'\n', (tags[i],))
        widget.tag_configure(tags[i], foreground=color, font=font, spacing1=20)

tags = [None]*5

root = tk.Tk()
root.wm_title("Text Demo")

font12 = ('Courier New', 12)
font16 = ('Courier New', 16, 'bold')
font20 = ('Courier New', 20, 'bold')

t = [[font20, 'Demo Text', 'blue'],
     [font16, 'Chapter 1', 'red'],
     [font12, 'Python is an easy to learn, powerful programming language. '
              'It has efficient high-level data structures and a simple but '
              'effective approach to object-oriented programming. Python’s '
              'elegant syntax and dynamic typing, together with its interpreted '
              'nature, make it an ideal language for scripting and rapid '
              'application development in many areas on most platforms.', 'black'],
     [font16, 'Chapter 2', 'red'],
     [font12, 'This tutorial introduces the reader informally to the basic '
              'concepts and features of the Python language and system. It '
              'helps to have a Python interpreter handy for hands-on experience'
              ', but all examples are self-contained, so the tutorial can be '
              'read off-line as well.', 'black'] ]

text = tk.Text(bg='white', font=font12, width=80, height=20, bd=10, padx=5, pady=5)
text.grid(row=0, column=0)

add_text(text, t)
text.tag_config(tags[0], justify=tk.CENTER, underline=True)

root.mainloop()
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章