4

我有以下代码片段,它显示了一个数字列表,并突出显示了当前关注的项目:

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屏幕向下滚动之前突出显示并聚焦的行为。实现这一目标的最佳方法是什么?

4

2 回答 2

3

接受的解决方案在第一次按键时失败:

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

注入我自己的不执行任何操作的实现会使错误消失,但它也完全破坏了所有键绑定。

我发现了这个,它似乎工作得很好:

class SelectableText(urwid.Edit):
    def valid_char(self, ch):
        return False
于 2016-02-14T13:09:49.333 回答
1

列表框中的项目需要是可选择的。这是一种方法:

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

items = map(lambda x: SelectableText(`x`), range(500))
于 2011-11-14T15:29:44.343 回答