Используя urwid, как отображать одну строку за раз нажатием клавиши?

Попытка создать простую функцию, которая отображает одну строку из текстового файла за раз, когда нажата клавиша ввода или страницы вниз. Я не хочу, чтобы строки очищались каждый раз. Другими словами, мне нужно приостановить программу до следующего нажатия клавиши. Так как он отображает только первую строку. Я пробовал некоторое время Правда: безрезультатно. Спасибо за помощь!

# Handle key presses
def handle_input(key):
    with open('mobydick_ch1.txt') as f:
        lines = f.readlines()
        line_counter = 0
        if key == 'enter' or key == 'page down':
            text_box.base_widget.set_text(lines[line_counter])
            line_counter += 1
            main_loop.draw_screen()

        elif key == 'Q' or key == 'q':
            raise urwid.ExitMainLoop()

person A. Michael    schedule 06.09.2016    source источник


Ответы (1)


Круто, похоже, вы создаете программу для чтения большого текста по одной строке за раз? знак равно

Я считаю, что лучший способ сделать это — создать собственный виджет.

Может быть, что-то вроде:

class LineReader(urwid.WidgetWrap):
    """Widget wraps a text widget only showing one line at the time"""
    def __init__(self, text_lines, current_line=0):
        self.current_line = current_line
        self.text_lines = text_lines
        self.text = urwid.Text('')
        super(LineReader, self).__init__(self.text)

    def load_line(self):
        """Update content with current line"""
        self.text.set_text(self.text_lines[self.current_line])

    def next_line(self):
        """Show next line"""
        # TODO: handle limits
        self.current_line += 1
        self.load_line()

И тогда вы можете использовать его как:

reader = LineReader(list(open('/etc/passwd')))

filler = urwid.Filler(reader)

def handle_input(key):
    if key in ('j', 'enter'):
        reader.next_line()
    if key in ('q', 'Q', 'esc'):
        raise urwid.ExitMainLoop

urwid.MainLoop(filler, unhandled_input=handle_input).run()

Я начал использовать urwid несколько месяцев назад и стал фанатом техники создания пользовательских виджетов, оборачивающих простые текстовые виджеты. знак равно

person Elias Dorneles    schedule 19.08.2017