разбиение на страницы с помощью модуля python cmd - PullRequest
8 голосов
/ 06 февраля 2009

Я создаю прототип приложения Python с помощью модуля cmd .

Некоторые сообщения пользователю будут довольно длинными, и я хотел бы разбить их на страницы. Появятся первые 10 (или настраиваемое число) строк сообщения, а нажатие на клавишу ПРОБЕЛ отобразит следующую страницу до конца сообщения.

Я не хочу изобретать что-то здесь, есть ли простое средство для реализации этой функции?

Ответы [ 4 ]

4 голосов
/ 06 февраля 2009

Простая вещь - просто передать ваш скрипт через "less" или подобную команду во время выполнения.

Вот простой метод, который делает примерно то, что вы хотите:

def print_and_wait(some_long_message):
    lines = some_long_message.split('\n')
    i=0
    while i < len(lines):
        print '\n'.join(lines[i:i+10])
        raw_input("press enter to read more...")
        i += 10

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

3 голосов
/ 31 марта 2009

Как сказал выше Йони, правильный способ сделать это - предоставить метод печати, который автоматически печатает страницы в вашем запущенном экземпляре cmd. Конструктор Cmd принимает аргументы stdin и stdout. Так просто предоставить объект, который работает как stdout и поддерживает ваш метод печати подкачки.

class PagingStdOut(object):
    def write(self, buffer, lines_before_pause=40):
        # do magic paging here...
1 голос
/ 04 сентября 2009

У меня был тот же вопрос. В модуль pydoc встроен пейджер. Я включил это таким образом (который я нахожу хакерским и неудовлетворительным ..., хотя я открыт для лучших идей).

Мне нравится идея, что она будет автоматически отображаться на странице, если будет более x результатов и включена подкачка страниц, что возможно реализовать, но здесь не сделано.

import cmd
from pydoc import pager
from cStringIO import StringIO
import sys

PAGER = True
class Commander(cmd.Cmd):
    prompt = "> "
    def do_pager(self,line):
        global PAGER
        line = line + " 1"
        tokens = line.lower().split()
        if tokens[0] in ("on","true","t", "1"):
            PAGER = True
            print "# setting PAGER True"
        elif tokens[0] in ("off","false","f","0"):
            PAGER = False
            print "# setting PAGER False"
        else:
            print "# can't set pager:  don't know -> %s" % tokens[0]

    def do_demo(self,line):
        results = dict(a=1,b=2,c=3)
        self.format_commandline_results(results)

    def format_commandline_results(self,results):
        if PAGER:
            ofh = StringIO()
        else:
            ofh = sys.stdout

        for (k,v) in sorted(results.items()):
            print >> ofh, "%s -> %s" % (k,v)

        if PAGER:
            ofh.seek(0)
            pager(ofh.read())

        return None

    def do_EOF(self,line):
        print "",
        return True

if __name__ == "__main__":
    Commander().cmdloop("# try: \n> pager off \n> demo \n> pager on \n> demo \n\n")
0 голосов
/ 02 апреля 2009

Функции подкачки можно найти в файле genutils.py IPython (см. page или page_dumb для более простой). Код немного сложен, но это, вероятно, неизбежно, если вы пытаетесь переноситься на системы, включая Windows и различные виды эмуляторов терминала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...