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

时间:2018-12-03 09:27:45

标签: python tkinter

我想突出显示我的文本小部件中最后添加的文本。 我已经看到了有关How to highlight text in a tkinter Text widget的示例。问题是我在文本中添加了"\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()

2 个答案:

答案 0 :(得分:1)

您的函数_highlight_current_line正在执行应做的事情:它将突出显示插入光标的行。但是,您想要突出显示最后插入的文本,这有所不同。您可以简单地创建一个新标签。 我们将其命名为'last_insert'

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_addtagstartend作为参数,其中startend是字符串'a.b'的形式,其中a是行索引(在顶部以1开头),b是行内的字符(从0开始)。您可以使用表达式修改索引(请参见此处:http://effbot.org/tkinterbook/text.htm。此外,“插入”是一个标记(在上述链接上读取)-并且"insert linestart"被tkinter替换为索引{{1} },其中"line.0"是插入光标当前所在的行。

答案 1 :(得分: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