GUI的终极选择:Tkinter6:Text

##Text
   (通过之前的学习我们知道绘制单行文本使用 Label 组件,多行选项我们使用 Listbox 组件,输入框用 Entry 组件,Button 组件就是按钮,Radiobutton 和 Checkbutton 分别对应单选和多选的情况,然后呢,有多个组件,我们还可以使用 Frame 和 LabelFrame 把它们构成一个框架,之后我们还学习了两个会滚的组件:Scrollbar 和 Scale,Scrollbar 就是滚动条,Scale 就是提供一个范围,让用户在这个范围内选择一个确切的值。)
   ※Text:Text(文本)组件用于显示和处理多行文本。在 Tkinter 的所有组件中,Text 组件显得异常强大和灵活,适用于多种任务。虽然该组件的主要目的是显示多行文本,但它常常也被用于作为简单的文本编辑器和网页浏览器使用。(例如IDLE他的输入框就是Text组件构成的)

   还是先来认识认识它

from tkinter import *

root = Tk()

text = Text(root,width=30,height = 2)
text.pack()

text.insert(INSERT,"I love \n")
text.insert(END,"Study.com!")


mainloop()

在这里插入图片描述                           在这里插入图片描述
   (解析:首先还是先来个root跟窗口,然后在实例化Test组件时text = Text(root,width=30,height = 2),参数我们可以设置宽度为30,30的单位就是30个平均字符的的单位,字符的平均宽度,那么30这个的字符平均宽度就相当于差不多有30个字符那么宽,height高设置为2,就代表行数,即有2行。此时运行是不会显示任何内容的,是空的文本
   往里面插入数据仍然可以使用insert方法,关于他的参数,我们熟悉的索引值可以END,END表示是在末尾处插入,但是这里还可以用INSERT,INSERT就表示输入光标所在的位置,就是你打字那一条闪来闪去的,那刚开始输入光标肯定是在左上角即0行0列的位置了,可以看到第一张截图,同时我们还可以对文本里的内容进行编辑,增删改,换行输入都可以,如第二张截图)

   Text 组价不仅支持插入和编辑文本,还支持插入一这些组件,比如一个按钮

from tkinter import *

root = Tk()

text = Text(root,width=30,height = 5)
text.pack()

text.insert(INSERT,"I love \n")
text.insert(END,"Study.com!")

def show():
    print("哟,我被点了")

b1 = Button(text,text = "点我呀",command=show)
text.window_create(INSERT,window=b1)

mainloop()

在这里插入图片描述
   (解析:先把行数给改为5,要插入一个组件,那么需要先生成一个组件,需要注意的是,第一参数不再是root根窗口咯,因为是要插入到Text组件,所以应该是写Text组件的实例化对象text,然后按钮被点击后就会触发show函数,
   然后还有一步就是用text对象的window_create方法完成在INSERT的位置(这些按钮嘛,window窗口的组件,所以叫window_create),即输入光标的位置插入一个window=b1,即window这个选项设置为b1,b1就是待插入按钮Button的实例化对象)

   Text 还支持插入 image 对象,即图片。下面实现当按下按钮就会在末尾插入图片的案例

from tkinter import *

root = Tk()

text = Text(root,width=30,height = 30)
text.pack()

photo = PhotoImage(file = "test.gif")


def show():
    text.image_create(END,image = photo)

b1 = Button(text,text = "点我呀",command=show)
text.window_create(INSERT,window=b1)


mainloop()

在这里插入图片描述
   (解析:在上面例子的基础上,首先把图片导入photo = PhotoImage(file = “test.gif”)生成photo图片对象,刚刚插入组件是window_create方法,那么同理插入图片就是用image_create方法,因为是按下按钮后插入,那么在show方法中实现,那么插入按钮组件时需要将按钮组件的实例化对象传给window选项,同理这里也有个image选项需要等于图片的实例photo,就可以实现了)

   除了这些Text 组件还有很多更牛的用法,以下慢慢道来

   Indexes用法: Indexes(索引)是用来指向 Text 组件中文本的位置,跟 Python 的序列索引一样,Text 组件索引也是对应实际字符之间的位置。
   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 "
   由于我们的Text组件是支持多行文本的,所以我们现在从一个一维空间变成了二维空间,我们就可以用行和列来定位一个位置。
   行/列 是最基础的索引方式,它们将索引位置的行号和列号以字符串的形式表示出来(中间以 “.” 分隔,例如 “1.0”)。需要注意的是,行号以 1 开始,列号则以 0 开始。你还可以使用以下语法构建索引:

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

   指定超出现有文本的最后一行的行号,或超出一行中列数的列号都不会引发错误。对于这样的指定,Tkinter 解释为已有内容的末尾的下一个位置。   (解析:已有内容的末尾的下一个位置这句话的意思就是说,比如下面那个代码的截图,他只有第一行有数据,如果你定位的到3行0列,想在这插入,是不行的,他会自动指到第二行第0列,即已有内容的末尾下一行)

   需要注意的是,使用 行/列 的索引方式看起来像是浮点值。其实不只像而已,你在需要指定索引的时候使用浮点值代替也是可以的:   (解析:比如下面这个例子 "1.2"和1.6索引是一样的,"1.2"也可以直接写出1.2,可以省了两个字符串的麻烦)

from tkinter import *

root = Tk()
 
text = Text(root, width = 30, heigh = 3)
text.pack()
 
text.insert(INSERT, "I love dog")
print(text.get("1.2", 1.6))
 
root.mainloop()

在这里插入图片描述

   使用 index() 方法可以将所有其他(除了这个的其他10个)支持的“索引”格式统一转换为“行/列”格式的索引号。

   ❤ " line.end " :
   行号加上字符串 “.end” 的格式表示为该行最后一个字符的位置:   (解析:这个例子就是把1.2到1.end,即第一个行第2位置到第一行最后一个位置都打印出来)

text.insert(INSERT, "I love dog")
print(text.get("1.2", "1.end"))

在这里插入图片描述
   ❤ " insert " :
   对应插入光标的位置。

   ❤ " current " :
   对应与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

   ❤ " end " :
   对应 Text 组件的文本缓冲区最后一个字符的下一个位置。

   ❤ " 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 的文本的最后一个字符之后)语法表示标签的范围。

"%s.first" % tagname
"%s.last" % tagname

   如果查无此 tag,那么 Tkinter 会抛出一个TclError 异常。

   ❤ " selection(SEL_FIRST,SEL_LAST) " :
   selection 是一个名为 SEL(或 “sel”)的特殊 tag,表示当前被选中的范围,你可以使用 SEL_FIRST 到 SEL_LAST 来表示这个范围。如果没有选中的内容,那么 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,只需使用相应的 PhotoImage 和 BitmapImage 对象。

   ❤ " expressions " :
   expressions 用于修改任何格式的索引,用字符串的形式实现修改索引的表达式。

   

表达式

含义

"+ 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. 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合
3. 注意,使用该表达式前边必须有一个空格隔开
" wordend" 1. 将索引移动到当前索引指向的单词的末尾
2. 单词的定义是一系列字母、数字、下划线或任何非空白字符的组合
3. 注意,使用该表达式前边必须有一个空格隔开

   TIPS:只要结果不产生歧义,关键字可以被缩写,空格也可以省略。例如:"+ 5 chars" 可以简写成 “+5c”

   在实现中,为了确保表达式为普通字符串,你可以使用 str 或格式化操作来创建一个表达式字符串。下边例子演示了如何删除插入光标前边的一个字符:

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

   Marks用法:

   (解析:通俗的理解的就是看书时,碰到了重点,拿小本本来记录他在这边数的位置,如果再拿绿色或马克笔来画出来显眼一些这个就是tag标签)

   Marks(标记)通常是嵌入到 Text 组件文本中的不可见对象。事实上 Marks 是指定字符间的位置,并跟随相应的字符一起移动。Marks 有 “insert”,“current” 和 user-defined marks(用户自定义的 Marks)。其中,“insert” 和 “current” 是 Tkinter 预定义的特殊 Marks,它们不能够被删除。

   “insert” 用于指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标(因此并不是所有的 Marks 都不可见)。

    “current” 用于指定与鼠标坐标最接近的位置。不过,如果你紧按鼠标任何一个按钮,它会直到你松开它才响应。

   你还可以自定义任意数量的 Marks,Marks 的名字是由普通字符串组成,可以是除了空白字符外的任何字符(为了避免歧义,你应该起一个有意义的名字)。使用 mark_set() 方法创建和移动 Marks。

   如果你在一个 Mark 标记的位置之前插入或删除文本,那么 Mark 跟着一并移动。删除 Marks 你需要使用 mark_unset() 方法,删除 Mark 周围的文本并不会删除 Mark 本身。

   如果有做相关练习的,应该会被 Mark 的很多特性所疑惑,在准备这个内容的时候也很是迷惑,找了不知多少文档…最后总结为下边几个例子讲解:

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

from tkinter import *

root = Tk()
 
text = Text(root, width = 30, heigh = 5)
text.pack()
 
text.insert(INSERT, "I love Dog")
text.mark_set("here", "1.2")
text.insert("here", "插")

 
root.mainloop()

在这里插入图片描述
   (解析:首先这句:text.mark_set(“here”, “1.2”)用mark_set方法先设置了一个标记,这个标记的名字叫here,设置在1.2这个位置,也就是l的位置,下一条语句就是在做的标记here前边插入了一个插字)

   例2,如果 Mark 前边的内容发生改变,那么 Mark 的位置也会跟着移动(说白了就是 Mark 会“记住”它后边的那货~):

text.insert(INSERT, "I love Dog")
text.mark_set("here", "1.2")
text.insert("here", "插")
text.insert("here", "入")

在这里插入图片描述
   (解析:当在1.2的位置即l的位置插入“插”字时,"插"字就占领了1.2这个位置,而Mark是记住了l的位置,所以Mark就变成了1.3,当在插入"入"字,mark就在1.4即l的位置,就是这个mark一直会记住l)

   例3,如果 Mark 周围的文本被删除了,Mark 仍然还在噢(只是它后边的那货被删除了,所以它六神无主,只能初始化为 “1.0”):

from tkinter import *


root = Tk()
 
 
text = Text(root, width = 30, heigh = 5)
text.pack()
 
text.insert(INSERT, "I love Dog")
text.mark_set("here", "1.2")
text.insert("here", "插")


text.delete("1.0", "end")
text.insert("here", "入")

 
root.mainloop()

在这里插入图片描述
   (解析:可以看到先用text.delete(“1.0”, “end”)把第一行都删了,然后继续在here这个标记插入"入"字,结果"入"是在1.0的位置,因为被初始化到1.0位置了)

   例4,只有 mark_unset() 方法可以解除 Mark 的封印:   (解析:删除了还使用就会报tkinter.TcError的错)

text.insert(INSERT, "I love Dog")
text.mark_set("here", "1.2")
text.insert("here", "插")

text.mark_unset("here")

text.delete("1.0", "end")
text.insert("here", "入")

在这里插入图片描述
   好,讲最后一点,我们看到了,默认插入内容到 Mark,是插入到它的左侧(就是说插入一个字符的话,Mark 向后移动了一个字符的位置)。那能不能插入到 Mark 的右侧呢?其实是可以的,通过 mark_gravity() 方法就可以实现。   (解析:gravity就是重心,引力的意思,这里直观的解释就是这个Mark偏向于哪边,他的默认是RIGHT,表示右边,就是说你插入一个数据,那么Mark是在这个数据的右边)

   例5(对比例2):

from tkinter import *


root = Tk()
 
text = Text(root, width = 30, heigh = 5)
text.pack()
 
text.insert(INSERT, "I love Dog")

text.mark_set("here", "1.2")
text.mark_gravity("here", LEFT)


text.insert("here", "插")
text.insert("here", "入")
 
root.mainloop()

在这里插入图片描述
   (解析:那么这里改成LEFT后,刚开始Mark是在1.2的位置,然后我们偏向改为了左边,就是说插入的东西是在Mark的右边,Mark保持在插入东西的左边,那么Mark永远都是在这个1.2的位置,他不会发生改变,默认他是RIGHT,在他前面插入数据,那么他会跟随他后边的数据走,改成LEFT就不会)


         Text 组件内容较多,下一章继续…入口–>GUI的终极选择:Tkinter7:Text(2)

发布了247 篇原创文章 · 获赞 116 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/w15977858408/article/details/104165584
今日推荐