Текстовый редактор на Python с возможностями «программного» ввода

#python #tkinter

#python #tkinter

Вопрос:

Мне нужен текстовый редактор, который, как функция, должен иметь возможность изменять некоторую информацию, которую он отображает на экране, когда он открыт.

Например, я открываю текстовый файл с помощью упомянутого выше текстового редактора и вижу на экране:

 |--------------------------------------------------------|
|          My Text Editor (C:myfile.txt)    [Button]    |
|--------------------------------------------------------|
|Name: John                                              |
|A&e: 32                                                 |
|Gender: Male                                            |
|                                                        | 
|                                                        |
  

Затем, например, если я нажму кнопку [Button] , я хочу, чтобы возраст 32 изменился, скажем, на 30, пока текстовый файл открыт.

Но я хочу сделать это без использования автоматизации клавиатуры и мыши…

Возможно ли это? Будет ли Tkinter достаточно для этой задачи?

Комментарии:

1. Как вы планируете «нажимать» на кнопку без использования клавиатуры и мыши? Что вы уже пробовали? У Tkinter есть текстовый виджет с методами, которые позволяют легко изменять что-либо в виджете.

2. да, tkinter, безусловно, справляется с этой задачей.

3. Привет, Брайан, спасибо за ответ. Я собираюсь использовать его для обновления файлов конфигурации, чтобы я мог использовать клавиатуру, но вместо того, чтобы постоянно вводить информацию внутри текстового файла, мне нужны обе возможности, я имею в виду обновление файла путем ввода новой информации и чтения новой информации из другого источника (буфер обмена, текстовые файлы, базы данных и т.д.), А затем изменение файла, который открыт передо мной, с помощью этой информации, прочитанной из других источников, а также набора текста. Приятно знать, что Tkinter может это делать! 🙂

Ответ №1:

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

Он делает это с помощью диспетчера контекста, который сохраняет курсор вставки, а затем вставляет или удаляет любой текст, который вы хотите. Это не особенно хороший стиль кодирования, но он показывает, что tkinter может делать со своим текстовым виджетом.

 import tkinter as tk
from datetime import datetime
from contextlib import contextmana&er

@contextmana&er
def preserve_insert_cursor(text):
    """Performs an action without chan&in& the insertion cursor location"""
    saved_insert = text.index("insert")
    yield
    text.mark_set("insert", saved_insert)

def chan&e_a&e():
    """Chan&e the a&e on line 3"""
    with preserve_insert_cursor(text):
        text.delete("3.5", "3.0 lineend")
        text.insert("3.5", "30")

def update_time():
    with preserve_insert_cursor(text):
        # find all ran&es of text ta&&ed with "time" and replace
        # them with the current time
        now = datetime.now()
        timestrin& = now.strftime("%H:%M:%S")

        ran&es = list(text.ta&_ran&es("time"))
        while ran&es:
            start = ran&es.pop(0)
            end = ran&es.pop(0)
            text.delete(start, end)
            text.insert(start, timestrin&, "time")

    # call this function a&ain in a second
    text.after(1000, update_time)

root = tk.Tk()
header = tk.Frame(root, bd=1, relief="raised")
text = tk.Text(root)
header.pack(side="top", fill="x")
text.pack(fill="both", expand=True)

button = tk.Button(header, text="Button", command=chan&e_a&e)
button.pack(side="ri&ht", padx=10)

# insert "Time:" with no ta&s, "<time&&t;" with the ta& "time",
# and then a newline with no ta&s
text.insert("end", "Time: ", "", "<time&&t;", "time", "n")

text.insert("end", "Name: Johnn")
text.insert("end", "A&e: 32n")
text.insert("end", "Gender: Malen")

update_time()

root.mainloop()
  

По статическому скриншоту этого не скажешь, но если вы запустите код, то увидите, что время обновляется в режиме реального времени даже во время набора текста.

Комментарии:

1. Я всегда учусь у вас чему-то новому. Я бы не смог написать это так гладко на python. Отличный код, Брайан!

Ответ №2:

Я думаю, лучший способ добиться этого — взять простой пример TextEditor для PyQt и добавить кнопку, чтобы делать то, что вы хотите.

В результате быстрого поиска я нашел, например, вот это: https://www.learnpyqt.com/examples/no2pads-simple-notepad-clone /

Комментарии:

1. Спасибо, @ca&coach. Быстро просмотрев, я вижу, что классы QPlainTextEdit и QTextCursor, похоже, справляются с этой задачей 🙂

2. Привет, @ca&coch. Мне пришлось изменить выбранный ответ, поскольку tkinter будет моим основным инструментом. Но я рад, что вы показали нам мощь PyQt!