Отрисовка позднего обновления текстового индекса tkinter - PullRequest
0 голосов
/ 11 июля 2020

Итак, я пытаюсь сделать базовый c текстовый редактор и ищу вверх и вниз учебники и спасибо к этому . Мне удается добавить и текстовый индекс строки спереди. Но проблема в его примере: Ctrl + V вернет ошибку, если я вставлю текст и не выберу что-то для замены, плюс небольшая задержка номеров строк рендеринга при событии прокрутки.

Мне удалось обработать ошибку Ctrl + V (по умолчанию такой ошибки нет) путем изменения self.text.bin(key, event), но все же у меня есть ошибка с рисованием номера строк указателя. Поэтому, когда я прокручиваю, будет задержка 3 (пример: в строке 8 будет строка номер 5). Я борюсь 2 дня, чтобы исправить это, но мои навыки закончились: (

import tkinter as tk

class Render:
    def __init__(self, master):
        self.canvas = tk.Frame(master)
        self.text = tk.Text(self.canvas, wrap="word", relief="groove")
        self.scroll_vertical = tk.Scrollbar(self.canvas, orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.scroll_vertical.set)
        self.index = LineIndex(self.canvas, width=30)
        self.index.Append(self.text)

        self.canvas.pack(expand=1, fill="both", side="top")
        self.index.pack(expand=0, fill="y", side="left")
        self.scroll_vertical.pack(expand=0, fill="y", side="right")
        self.text.pack(expand=1, fill="both", side="right")

        #// Debug (fill some lines for scroll debug)
        for i in range(1,22): self.text.insert("end", f">> {i} <<\n")

        self.EventList = {"<MouseWheel>": self.index_Update, "<Configure>": self.index_Update,
                          "<KeyPress>": self.k_Press, "<KeyRelease>": self.k_Release}
        for key, event in self.EventList.items(): self.text.bind(key, event)

    #// Events
    def index_Update(self, event):
        self.index.Draw()

    def k_Press(self, event):
        self.index_Update(self)

    def k_Release(self, event):
        self.index_Update(self)


class LineIndex(tk.Canvas):
    def __init__(self, *args, **kwargs):
        tk.Canvas.__init__(self, *args, **kwargs)
        self.text_widget = None

    def Append(self, widget):
        self.text_widget = widget

    def Draw(self, *args):
        self.delete("all")

        index_pure = self.text_widget.index("@0,0")
        while 1:
            dline = self.text_widget.dlineinfo(index_pure)
            if dline is None: break
            y = dline[1]
            index = str(index_pure).split(".")[0]
            # Auto align line index // 26/4 20/3 14/2 8/1 (6/char)
            index_size = len(self.text_widget.index("end-1c").split(".")[0])
            index_align = 2 + (6 * index_size)
            self.create_text(index_align, y, anchor="ne", text=index)
            index_pure = self.text_widget.index(f"{index_pure}+1line")

if __name__ == "__main__":
    root = tk.Tk()
    Render(root)
    root.mainloop()
...