Сохранение и восстановление содержимого окна терминала с помощью Curses for Python

Я делаю консольное приложение на Python с библиотекой Curses (window-curses). В какой-то момент мне нужно сохранить состояние окна (или, возможно, все состояние терминала) в какой-то объект/переменную и восстановить его в будущем. Как правильно это сделать?

В документации модуля я нашел методы, которые делают это путем сохранения состояния в файл. Но, возможно, существует какой-то другой способ сделать это в памяти.

Единственное, что я могу придумать автоматически, — это переключение между альтернативным экранным буфером и обратно.

Barmar 10.05.2024 19:27

Кстати, вас тоже могут заинтересовать благословения! pypi.org/project/blessings

ti7 10.05.2024 19:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если у вас есть способ сохранить в файл, вы можете передать этой функции io.BytesIO (принимает ссылку/файл) или (менее приятно) tempfile.NamedTemporaryFile, если она принимает только путь

Путь к файлу в памяти без дампа в tmp

Ответ принят как подходящий

Как вы обнаружили, вы можете использовать такие вещи, как функция putwin, чтобы сохранить блокнот в файл и getwin, чтобы восстановить его из файла. Если вы хотите сохранить это в памяти, а не в файле на диске, вы можете использовать объект BytesIO вместо настоящего дескриптора файла.

import io
import curses
curses.initscr()
pad = curses.newpad(100, 100)
# ... do things with the pad

# save the pad in memory
f = io.BytesIO()
pad.putwin(f)


# later recall the data
f.seek(0)  # reset the cursor to the beginning of the "file"
pad.getwin(f)

Вы также можете написать несколько функций, чтобы описать это по-другому:

def save_win(win) -> bytes:
    f = io.BytesIO()
    win.putwin(f)
    bytes_data = f.getvalue()
    return bytes_data


def load_win(bytes_data: bytes) -> curses.window:
    f = io.BytesIO(bytes_data)
    f.seek(0)
    return curses.getwin(f)

Другие вопросы по теме