Итак, я пытаюсь сделать базовый 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()