第10章 文本控件(Text)
文本控件(Text)用來顯示多行格式化文本的控件。文本控件很強大, 很靈活, 可以完成很多功能.。除了顯示多行文本之外,還可以編輯文字,顯示圖片,甚至是網頁。
可以把文字、標識(marks)、圖片以及嵌入式的窗口放置到文本控件中。在不同的區域可以顯示不同的格式。如果把回調函數於不同區域的事件聯系起來,還可以實現對不同區域做出不同的響應。
默認的情況下,文本控件是可以編輯的。可以使用鼠標或者鍵盤進行編輯。如果只想顯示文本或者圖片,可以禁止文本控件的編輯功能,只需設置state=tk.DISABLED就可以了。
10.1 屬性
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,bg='green')
b1.pack()
root.mainloop()
結果:
10.1.3 cursor
定義文本控件的光標類型。默認是’插入光標’。詳細說明見3.3.6節
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,cursor='mouse')
b1.pack()
root.mainloop()
結果:
10.1.4 exportselection
是一個布爾類型的值,在文本控件中沒有作用。
10.1.5 foreground(fg)
定義輸入文字的顏色。默認是黑色。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,fg='red')
b1.pack()
root.mainloop()
結果:
10.1.6 font
定義字體的大小。文本控件可以設置多種字體同時顯示。具體的方法參見tag。
10.1.7 Height和width
定義文本控件的高度和寬度。高度以行為單位,而寬度以字符為單位。高度與寬度的度量與字體的大小也有關系。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=10)
b1.pack()
root.mainloop()
結果:
10.1.8 highlightbackground、highlightcolor和highlightthickness
這三個參數的功能就是給文本控件添加一個外框。當沒有獲得輸入焦點的時候,外框的顏色由highlightbackground設定,當由輸入焦點的時候外框的顏色highlightcolor設定。外框的寬度由highlightthickness設定。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=10,
highlightthickness=5,highlightcolor='red',
highlightbackground='yellow')
b1.pack()
b2=tk.Entry(root)
b2.pack()
root.mainloop()
結果:
10.1.9 insertbackground 和insertborderwidth
插入光標的背景顏色以及寬度。參見輸入控件(Entry)中的說明。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,insertbackground ='red')
b1.pack()
root.mainloop()
結果:
說明:插入光標已經變成了紅色的。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,
insertbackground ='red',
insertborderwidth=-20)
b1.pack()
root.mainloop()
結果:
說明:insertborderwidth是設置插入光標的邊框。不過正的的數值只有一種效果,而設置為負的數值反而可以按照給定的數值設置插入光標的邊框。
10.1.10 insertofftime 和 insertontime
這兩個參數設置光標閃爍的時間。insertofftime 是光標不顯示的時間,insertontime是光標顯示的時間。這樣就可以實現光標閃爍的效果。單位是毫秒。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,insertofftime=200,insertontime=1000)
b1.pack()
root.mainloop()
10.1.11 insertwidth
定義插入光標的寬度。單位是像素。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,insertwidth=20)
b1.pack()
root.mainloop()
結果:
10.1.12 maxundo
參見10.1.23 undo/redo章節。
10.1.13 padx和pady
設置文本控件的水平和垂直內邊距。請參考前面的章節的描述。
10.1.14 relief
文本控件的邊框的3D效果。具體說明見3.3.5節。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,bd=5,relief='groove')
b1.pack()
root.mainloop()
結果:
10.1.15 selectbackground
選中文本的背景顏色。默認是藍色的。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,selectbackground='red')
b1.pack()
root.mainloop()
結果:
10.1.16 selectborderwidth
選中區域的邊框寬度。
10.1.17 selectforeground
選中文本的字體顏色。默認是白色的。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,height=5,width=30,selectforeground='yellow')
b1.pack()
root.mainloop()
結果:
10.1.18 setgrid
是一個boolean參數。如果設置為True,會窗口最大化,這樣可以顯示完整的Text控件。
10.1.19 spacing1,spacing2和spacing3
spacing1:額外的上行間距。如果有折行顯示,只在第一行增加間距
spacing2;折行的行間距
spacing3:額外的下行間距。如果有折行,只在最後一行顯示。
#代碼1:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root)
b1.pack()
root.mainloop()
#代碼2:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,width=25,spacing1=20,
spacing2=30,spacing3=50)
b1.pack()
root.mainloop()
結果:
說明:
圖二的第一行與頂部的間距,就是上行間距,有spacing1設置
圖二中的折行,由spacing2設置。程序中設置的是30,可以看到有明顯的間距。
圖二中間距最大的就是設置了下行間距,spacing3=50。
與圖一對照就可以知道了,因為圖一沒有任何的間距設置。
10.1.20 state
文本控件只有2種狀態:NORMAL和DISABLED。NORMAL狀態可以編輯、輸入文本等功能。而DISABLED不能進行任何操作。
10.1.21 tabs
tabs 是設置文本控件的tab的位置。默認的數值是8個字符,也就是每按一次Tab鍵,插入光標移動8個字符。如果已經輸入了2個字符,那麼只移動6個字符。也就是說每次移動8的倍數個字符的位置。
tabs屬性可以設置每次移動的距離,具體的單位見下方說明:
無參數:表示按照像素單位移動
c=厘米
i=英寸
M=毫米
P=打印機的點,即1/70英寸
說明:默認的Tabs為8個字符,不受字體大小的影響
Tab的移動可以是非線性的,就是說每次移動的距離可以不一樣,可以把定義的每次移動距離聲明為一個元組,賦值給tabs屬性,比如:
10.1.22 takefocus
設置是否可以通過Tab獲得輸入焦點。默認是可以。如果takefocus被設置為False,就無法使用Tab鍵來獲得輸入焦點了,只能使用鼠標操作。
10.1.23 undo/redo
文本控件支持undo/redo功能。默認是不支持的,需要通過設置undo=True來開啟undo/redo功能。此功能的實現是通過記錄每一次修改來實現的。每一次的插入或者刪除,都被記錄在一個堆棧中。如果是刪除,就記錄刪除的文字;如果是插入,就記錄插入的文字。於此同時,還有記錄刪除或者插入的位置。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,undo=True)
b1.pack()
root.mainloop()
Undo/redo是按照光標的移動來判斷的。如果光標是順序移動,就不會插入新的標記。比如我們輸入了“123and456”如果我們把光標重新移動到”and”處,並刪除”and”,內置的算法會插入一個標記,與我們輸入的”123and456”區隔。如果這個時候,調用undo功能,會首先恢復’and’,然後再刪除“123and456”
這些標記是默認記錄的。實際上可以通過autoseparators 屬性來設置。默認情況autoseparators=True。如果把autoseparators=False,就會不記錄每次的修改 。Undo會刪除所有的輸入內容,redo恢復所有的內容。簡單粗暴。
還有一個屬性是maxundo,記錄最大的undo次數的。默認值是0,也就是記錄全部的修改行為。如果設置maxundo=5,就只記錄5次修改行為。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,undo=True,maxundo=5)
b1.pack()
root.mainloop()
結果:
說明:設置maxundo=5之後,系統只記錄5次修改,只能undo5次。
10.1.24 wrap
wrap屬性設定如何折行顯示文本控件的內容。有兩種方式來實現折行:
(1)字符分隔
當出現折行的時候,該方法可以在任何字符處分隔。
(2)單詞分隔
當出現折行的時候,該方法會按照單詞來分隔。
#代碼1:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,width=15,wrap=tk.CHAR)
b1.pack()
root.mainloop()
#代碼2:
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,width=15,wrap=tk.WORD)
b1.pack()
root.mainloop()
結果:
折行顯示也可以關閉。這個時候所有的字符都在一行,除非輸入回車。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
b1=tk.Text(root,width=15,wrap=tk.NONE)
b1.pack()
root.mainloop()
10.1.25 xscrollcommand
為文本控件增加水平滾動條。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
f=tk.Frame(root)
s1 = tk.Scrollbar(f,orient=tk.HORIZONTAL)
b1 = tk.Text(f,width=20,height=5,
xscrollcommand=s1.set,wrap=tk.NONE)
b1.pack()
s1.pack(side=tk.BOTTOM,fill=tk.X)
s1.config(command=b1.xview)
f.pack()
root.mainloop()
結果:
10.1.26 yscrollcommand
為文本控件增加垂直滾動條。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
f=tk.Frame(root)
s1 = tk.Scrollbar(f,orient=tk.VERTICAL)
b1 = tk.Text(f,width=20,height=5,
yscrollcommand=s1.set,wrap=tk.NONE)
s1.pack(side=tk.RIGHT,fill=tk.Y)
s1.config(command=b1.yview)
b1.pack()
f.pack()
root.mainloop()
結果:
還可以為文本控件增加水平和垂直兩個方向的滾動條。
import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
f=tk.Frame(root)
s1 = tk.Scrollbar(f,orient=tk.VERTICAL)
s2 = tk.Scrollbar(f,orient=tk.HORIZONTAL)
b1 = tk.Text(f,width=20,height=5,wrap=tk.NONE,
yscrollcommand=s1.set,
xscrollcommand=s2.set)
s1.pack(side=tk.RIGHT,fill=tk.Y)
s1.config(command=b1.yview)
s2.pack(side=tk.BOTTOM,fill=tk.X)
s2.config(command=b1.xview)
b1.pack(fill=tk.BOTH)
f.pack()
root.mainloop()
結果:
Series Objects and DataFrame T
List of articles 1. Last artic