首頁 > 軟體

python GUI多行輸入文字Text的實現

2022-06-28 14:02:32

Text的屬性wrap

from tkinter import *
root = Tk()
root.geometry('200x300')
te = Text(root,height=20,width=15)
#將多行輸入文字放入(pack)視窗中
te.pack()
#持續執行程式
root.mainloop()

這個文字方塊的高度為20,寬度為15,單位為字元。可以看到當每行的內容不會超過15字元,不斷輸入會發現,當所輸入的內容超過20行,文字方塊會自動增加新行用於輸入新的內容。

也就是說,在沒有明確說明的情況下,在多行文字輸入時,內容是不受限制的,但是每行能輸入多少字元是有限制。

當然每行能輸入的內容也可以不受到限制,這就要說到wrap屬性。

wrap和Label和Button的wraplength屬性是有差別的。wraplength是為了完全顯示標籤或按鈕的文字內容,而採取多行顯示。而Text的內容能完全顯示,wrap取不同的值。顯示的方式不一樣。

wrap可以有三個值:NONE、WORD、CHAR。

#其它的部分和上面的一樣,只是加了個wrap屬性
te = Text(root,height=20,width=15,wrap=NONE)

高度和寬度還是20、15,只不過屬性wrap的值為NONE。這樣的話,在沒有手動換行的情況,每行可以不斷輸入內容。如果向文字方塊放入檔案內容,比如text、word檔案,多行文字方塊中每行內容和檔案中的內容一致。

#wrap=CHAR
te = Text(root,height=20,width=15,wrap=CHAR)

#wrap=WORD
te = Text(root,height=20,width=15,wrap=WORD)

上面就是wrap值為WORD和CHAR的區別。可以看到值為WORD時,文字方塊會保證字元的完整性,而值為CHAR時不會。兩者,每行都會限制在15個字元,只不過換行時的方式不一樣。

當文字方塊的內容比較多時,可以藉助卷軸來瀏覽內容。有垂直卷軸、水平卷軸。

設定垂直卷軸

想要的效果:當我們滑動垂直滾條時,文字內容也隨著上下變動。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
#f=tk.Frame(root)
#建立卷軸物件,預設是垂直卷軸,orient=tk.VERTICAL
s1 = tk.Scrollbar(root) #卷軸是要放在視窗上,其引數為視窗物件
#建立多行輸入文字物件
b1 = tk.Text(root,width=20,height=5,
             yscrollcommand=s1.set)
#獲取文字檔案中的內容
with open(r'C:UsersAdministratorDesktop杜甫.txt') as a:
    data = a.read()
#將文字檔案的內容放入文字方塊中
b1.insert(tk.END,data)
s1.pack(side=tk.RIGHT,fill=tk.Y)
s1.config(command=b1.yview)
b1.pack()
#f.pack()
root.mainloop()

效果圖示

建立完垂直卷軸物件和多行輸入文字物件後,需要注意:

  • 1.yscrollcommand=s1.set,這樣滑動文字方塊的內容,卷軸也會滑動
  • 2.s1.config(command=b1.yview),這樣滑動卷軸,文字方塊的內容也會滑動。
  • 3.s1.pack(side=tk.RIGHT,fill=tk.Y),這樣卷軸才能充滿y軸方向,而不只是一小部分。

設定水平卷軸

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
#f=tk.Frame(root)
s1 = tk.Scrollbar(root,orient=tk.HORIZONTAL)
b1 = tk.Text(root,width=20,height=5,wrap=tk.NONE,
             xscrollcommand=s1.set,cursor='circle',
             selectbackground='yellow', selectforeground='blue')
#text內容的初始化
with open(r'C:UsersAdministratorDesktop杜甫.txt') as a:
    data = a.read()
#放進杜甫的《茅屋為秋風所破歌》
b1.insert(tk.END,data)
b1.pack()
#獲得文字中的內容
#print(b1.get(1.4,3.5),type(b1.get(1.4,3.5)))
s1.pack(side=tk.BOTTOM,fill=tk.X)
s1.config(command=b1.xview)
#f.pack()
root.mainloop()

效果圖示

設定水平卷軸會出現一個問題,就是卷軸不顯示。這是因為,在預設情況下,每行的字元數會有限制,這樣就用不上水平卷軸。如果要解除限制,或者說使放入的文字內容以其原有的方式換行,需要加入wrap=NONE。

獲得文字內容

我們知道Label、Button都有text屬性,和這兩者不同的是,Entry、Text不能用text屬性填入文字內容,Entry使用的是textvariable屬性,Text使用insert插入文字內容,Entry和Text的文字內容是動態的,可以輸入更改的。

Entry和Text均可輸入文字內容,只不過Text可以輸入多行。所以Entry沒有height屬性,而Text有。在Entry和Text輸入文字內容後,可以用get()獲得字串形式的文字內容。

import tkinter as tk
root=tk.Tk()
root.geometry('300x240')
#f=tk.Frame(root)
s1 = tk.Scrollbar(root,orient=tk.HORIZONTAL)
b1 = tk.Text(root,width=20,height=5,wrap=tk.NONE,
             xscrollcommand=s1.set,cursor='circle',
             selectbackground='yellow', selectforeground='blue')
#text內容的初始化
with open(r'C:UsersAdministratorDesktop杜甫.txt') as a:
    data = a.read()
#放進杜甫的《茅屋為秋風所破歌》
b1.insert(tk.END,data)
b1.pack()
#獲得文字中的內容
#print(b1.get(1.4,3.5),type(b1.get(1.4,3.5)))
s1.pack(side=tk.BOTTOM,fill=tk.X)
s1.config(command=b1.xview)
#f.pack()
#button的回撥函數
def pri1():
    print(b1.get(1.0, 5.0), type(b1.get(1.4, 3.5)))
#由於文字內容可以隨時變化,button獲得最新的文字內容
button = tk.Button(root,text='button',command=pri1)
button.pack()
root.mainloop()

點選Button按鈕,會獲得文字內容

我們這裡擷取的是一段。每點選一次按鈕,獲取一次文字內容。所以建立Button按鈕可以獲取文字當前的內容。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com