Задать вопрос
@Fizl

Как показывать изменение текстовом документе через Text?

Допустим есть какой-нибудь файл text.txt. Мне необходимо выводить его с помощью Text, но также дополнять его содержимое, если, пока программа была включена, он был как-то изменен. Помогите, пожалуйста
  • Вопрос задан
  • 29 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Вы можете настроить прокси для виджета, и в этом прокси вы сможете определять, когда что-либо было вставлено или удалено. Вы можете использовать эту информацию для создания виртуального события, которое может быть связано с любым другим событием.

Начнем с создания собственного класса текстового виджета, который вы будете использовать, как и любой другой текстовый виджет:
import Tkinter as tk

class CustomText(tk.Text):
    def __init__(self, *args, **kwargs):
        """A text widget that report on internal widget commands"""
        tk.Text.__init__(self, *args, **kwargs)

        # create a proxy for the underlying widget
        self._orig = self._w + "_orig"
        self.tk.call("rename", self._w, self._orig)
        self.tk.createcommand(self._w, self._proxy)

    def _proxy(self, command, *args):
        cmd = (self._orig, command) + args
        result = self.tk.call(cmd)

        if command in ("insert", "delete", "replace"):
            self.event_generate("<<TextModified>>")

        return result


Прокси-сервер в этом примере выполняет три функции:

1. Сначала он вызывает фактическую команду виджета, передавая все полученные аргументы.
2. Затем он генерирует событие для каждой вставки и каждого удаления.
3. Затем он генерирует виртуальное событие
4. И, наконец, он возвращает результаты фактической команды виджета.

Вы можете использовать этот виджет точно так же, как любой другой текстовый виджет, с дополнительным преимуществом, которое вы можете привязать к <>.

Например, если вы хотите отобразить количество символов в текстовом виджете, вы можете сделать что-то вроде этого:
root = tk.Tk()
label = tk.Label(root, anchor="w")
text = CustomText(root, width=40, height=4)

label.pack(side="bottom", fill="x")
text.pack(side="top", fill="both", expand=True)

def onModification(event):
    chars = len(event.widget.get("1.0", "end-1c"))
    label.configure(text="%s chars" % chars)

text.bind("<<TextModified>>", onModification)

root.mainloop()


И Вам останеться просто прикрутить это всё на обычном взаимодействии с файлом "text.txt"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы