Urwid ListBox: Как получить плавное движение фокуса? - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть следующий фрагмент кода, который показывает список чисел и выделяет элемент, находящийся в фокусе:

import urwid

palette = [('header', 'white', 'black'),
    ('reveal focus', 'black', 'dark cyan', 'standout'),]

items = map(lambda x: urwid.Text(`x`), range(500))
items = map(lambda x: urwid.AttrMap(x, None, 'reveal focus'), items)

walker = urwid.SimpleListWalker(items)
listbox = urwid.ListBox(walker)

loop = urwid.MainLoop(listbox, palette)
loop.run()

Когда я запускаю программу, терминал выглядит следующим образом:

0   <-- highlighted
1
2
3
...

Если я нажму кнопку down, вид изменится на:

1
2
3
4   <-- highlighted
...

Мне бы хотелось поведение, при котором 0-3 подсвечивается и фокусируется, прежде чем экран прокручивается вниз.Каков наилучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2016

При первом нажатии не удается принять принятое решение:

AttributeError: 'SelectableText' object has no attribute 'keypress'

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

Я нашел это, и, кажется, работает нормально:

class SelectableText(urwid.Edit):
    def valid_char(self, ch):
        return False
1 голос
/ 14 ноября 2011

Элементы в списке должны быть выбраны.Вот один из подходов:

class SelectableText(urwid.Text):
    ...
    def selectable(self):
        return True
...

items = map(lambda x: SelectableText(`x`), range(500))
...