第10章 文本控件(Text)
文本控件(Text)用来显示多行格式化文本的控件。文本控件很强大, 很灵活, 可以完成很多功能.。除了显示多行文本之外,还可以编辑文字,显示图片,甚至是网页。
可以把文字、标识(marks)、图片以及嵌入式的窗口放置到文本控件中。在不同的区域可以显示不同的格式。如果把回调函数于不同区域的事件联系起来,还可以实现对不同区域做出不同的响应。
默认的情况下,文本控件是可以编辑的。可以使用鼠标或者键盘进行编辑。如果只想显示文本或者图片,可以禁止文本控件的编辑功能,只需设置state=tk.DISABLED就可以了。
10.1 属性

属性参数描述
autoseparators单词之间的间隔。默认值是1
background
bg
设置背景颜色,如bg=‘green’
borderwidth
bd
文本控件的边框宽度。默认是1-2个像素。
cursor文本控件的光标。默认是字符插入光标(一般是一个“I-beam”类型的光标)
exportselection是否允许拷贝内容到剪贴板
foregroundfg设置前景(文本)颜色
font设置字体类型与大小
height文本控件的高度。默认是24行。
highlightbackground定义文本控件没有获得输入焦点状态下的高亮背景颜色。就是文本控件的亮边。
highlightcolor与highlightbackground属性类似。不过是文本控件获得输入焦点时的边框颜色。
highlightthickness文本控件获得输入焦点时的边框宽度。一般1-2个像素。
insertbackground设置文本控件插入光标的颜色
insertborderwidth插入光标的边框宽度。如果是一个非0的数值,光标会使用RAISED效果的边框。
insertofftime
insertontime
这两个属性控制插入光标闪烁效果。就是插入光标的出现和消失的时间。单位是毫秒。
insertwidth设置插入光标的宽度。
maxundo最大Undo的次数。默认是0。
padx水平边框的内边距
pady垂直边框的内边距
relief指定文本控件的边框3D效果,默认是flat,可以设置的参数;flat、groove、raised、ridge、solid、sunken
selectbackground设置选中文本的背景颜色
selectborderwidth设置选中区域边界宽度。
selectforeground设置选中文本的颜色
setgridboolean类型。为True时,可以让窗口最大化,并显示整个Text控件
spacing1上行间距。如果有折行,只在第一行起作用
spacing2折行之间的行间距
spacing3下行间距。如果有折行,只在最后一行起作用。
state定义文本控件的状态。状态有二种:NORMAL和DISABLED
tabs定义按动Tab键时候的移动距离。
takefocus定义是否可以使用Tab键移动输入焦点到该控件。
undo开启undo/redo功能。
width定义文本控件的宽度,单位是字符个数。
wrap定义如何折行显示文本控件的内容
xscrollcommand
yscrollcommand
将滚动条与文本控件关联起来,处理滚动条动作。滚动条分别对应水平或者垂直滚动条。
10.1.1 autoseparators
见undo/redo
10.1.2 background(bg)
设置文本控件的背景颜色。
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()

结果:
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐