Python 如何突出显示文本小部件tkinter中最后添加的文本

Python 如何突出显示文本小部件tkinter中最后添加的文本,python,tkinter,Python,Tkinter,我想突出显示我的文本小部件中最后添加的文本。 我已经看到了一个与此相关的示例。问题是我添加了一个带有“\n”的文本。这就是为什么程序将当前行看作一条新的线,因此它突出了空行。 你知道我如何修改程序吗?这是我的密码 import time import tkinter as tk from threading import Thread class MyApp: def __init__(self, master): self.master = master self.tex

我想突出显示我的文本小部件中最后添加的文本。 我已经看到了一个与此相关的示例。问题是我添加了一个带有
“\n”
的文本。这就是为什么程序将当前行看作一条新的线,因此它突出了空行。 你知道我如何修改程序吗?这是我的密码

import time
import tkinter as tk
from threading import Thread


class MyApp:

def __init__(self, master):
    self.master = master
    self.text = tk.Text(self.master)
    self.text.pack(side="top", fill="both", expand=True)
    self.text.tag_configure("current_line", background="#e9e9e9")
    self.start_adding_text()
    self._highlight_current_line()


def start_adding_text(self):
    thrd1 = Thread(target=self.add_tex)
    thrd1.start()

def add_tex(self):
    text = "This is demo text\n"
    for _ in range(20):
        self.text.insert(tk.END, text)
        time.sleep(0.1)
    return

def _highlight_current_line(self, interval=100):
    '''Updates the 'current line' highlighting every "interval" milliseconds'''
    self.text.tag_remove("current_line", 1.0, "end")
    self.text.tag_add("current_line", "insert linestart", "insert lineend+1c")
    self.master.after(interval, self._highlight_current_line)


if __name__ == '__main__':
   root = tk.Tk()
   app = MyApp(master=root)
   root.mainloop()

您的函数
\u highlight\u current\u line
正在执行它应该执行的操作:它高亮显示插入光标的行。但是,您需要突出显示最后插入的文本,这是不同的。您只需创建一个新标记。 让我们把它命名为“最后一次插入”:

self.text.tag_configure("last_insert", background="#e9e9e9")
添加文本时,可以指定附加到插入文本的标记:

self.text.insert(tk.END, text, ('last_insert',))
当然,如果只想突出显示最后插入的文本,可以添加以下内容:

self.text.tag_remove("last_insert", 1.0, "end")

备注:tkinter函数
tag\u add
作为参数
tag
start
end
,其中
start
end
是字符串形式的文本索引
'a.b'
,其中
a
是行索引(从顶部的1开始)而
b
是此行中的字符(以0开头)。您可以使用表达式修改索引(请参见此处:。此外,“插入”是一个标记(在前面的链接中读取)-
“insert linestart”
由索引
“line.0”替换为tkinter
其中
是插入光标当前所在的行。

您的函数
\u highlight\u current\u行
正在做它应该做的事情:它高亮显示插入光标的行。但是您想要的是高亮显示最后插入的文本,这是不同的。您可以简单地创建一个新标记。 让我们把它命名为“最后一次插入”:

self.text.tag_configure("last_insert", background="#e9e9e9")
添加文本时,可以指定附加到插入文本的标记:

self.text.insert(tk.END, text, ('last_insert',))
当然,如果只想突出显示最后插入的文本,可以添加以下内容:

self.text.tag_remove("last_insert", 1.0, "end")

备注:tkinter函数
tag\u add
作为参数
tag
start
end
,其中
start
end
是字符串形式的文本索引
'a.b'
,其中
a
是行索引(从顶部的1开始)而
b
是此行内的字符(以0开头)。您可以使用表达式修改索引(请参见此处:。此外,“insert”是一个标记(在前面的链接中读取)“insert linestart”由tkinter替换为索引
“line.0”
其中
是插入光标当前所在的行。

您可以检查是否在最后一行并删除换行:

def add_tex(self):
    loop_times=20
    text = "This is demo text\n"
    for id,_ in enumerate(list(range(loop_times))):
        if id==loop_times-1:
            text = "This is demo text"
        self.text.insert(tk.END, text)
        time.sleep(0.1)
    return

您可以检查是否在最后一行并删除换行:

def add_tex(self):
    loop_times=20
    text = "This is demo text\n"
    for id,_ in enumerate(list(range(loop_times))):
        if id==loop_times-1:
            text = "This is demo text"
        self.text.insert(tk.END, text)
        time.sleep(0.1)
    return