我想突出显示我的文本小部件中最后添加的文本。
我已经看到了有关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()
答案 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_add
以tag
,start
,end
作为参数,其中start
和end
是字符串'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