Это, конечно, возможно. С историей можно работать несколько независимо от ввода, поэтому в идеале у вас должен быть объект, представляющий вашу историю, с помощью таких методов, как addLine
и previousLine
и так далее. Затем вы приклейте это к пользовательскому интерфейсу по вашему выбору, будь то поле ввода в приложении Gtk или что-то в stdio.
Как часть (незаконченного) IRC-клиента, я написал что-то вроде этого: https://github.com/exarkun/invective/blob/master/invective/history.py
И на самом деле, в том же проекте вы найдете LineInputWidget , который подключает это к stdio, а также реализует такие вещи, как kill и yank в стиле emacs, слово вперед и назад и т. Д.
stdiodemo.py не может обрабатывать такие вещи, как стрелка вверх и стрелка вниз, что вам, вероятно, понадобится для разумной навигации по истории. Вместо этого вам нужно обработать stdio в необработанном режиме с помощью некоторого кода, который знает, как интерпретировать последовательности управления терминалом. Если вы когда-либо запускали «cat» и нажимали стрелку вверх или любую другую функциональную клавишу, то вы знаете, что для каждого из них есть специальная последовательность байтов. Что-то в вашей программе должно интерпретировать эти последовательности и превращать их во что-то разумное. Это то, что делает twisted.conch.insults.insults.ServerProtocol
. Он превращает байт-транспорт, связанный с терминалом, в другой, более богатый вид транспорта: транспорт, который может сообщить вам, когда поступили байты, но также и при нажатии различных специальных клавиш. Вы можете увидеть пример запуска линейного протокола с историей ввода, выполнив:
python -m twisted.conch.stdio
Это запускает Python REPL с использованием ServerProtocol
и одного из классов истории ввода в самом Twisted (особенность этого REPL заключается в том, что у него есть реактор, работающий одновременно с обработкой вашего ввода, что является сложной задачей в обычном режиме). Python REPL).
Вы можете найти источник для этого в twisted / conch / stdio.py. Важный код подключения stdio находится в классе runWithProtocol
. Посмотрите, как он создает экземпляр ServerProtocol
и подключает его к stdio с помощью StandardIO
(так что он просто строит больше поверх того, что делает stdiodemo.py). ServerProtocol
интерпретирует только байты из терминала. В ней нет логики вашего приложения. Поэтому вам нужно дать ему класс, который реализует логику вашего приложения. И это именно то, что делает оскорбление .