Как выделить последний добавленный текст в текстовом виджете tkinter - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу выделить последний добавленный текст в моем текстовом виджете.Я видел пример относительно этого Как выделить текст в виджете Текст tkinter . Проблема заключается в том, что я добавляю текст с "\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 голосов
/ 03 декабря 2018

Вы можете проверить, находитесь ли вы в последней строке, и удалить новую строку:

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
0 голосов
/ 03 декабря 2018

Ваша функция _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, где startend - текстовые индексы в виде строки 'a.b', где a - индекс строки (начиная с 1 сверху), а b - символ внутри этой строки (начиная с 0).Вы можете изменить индекс с помощью выражений (см. Здесь: http://effbot.org/tkinterbook/text.htm.. Далее, «вставить» - это отметка (прочитанная по вышеупомянутой ссылке) - и "insert linestart" заменяется на tkinter индексом "line.0", где line это строка, в которой находится курсор вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...