Urwid ListBox:如何实现流畅的焦点移动?

4 投票
2 回答
1547 浏览
提问于 2025-04-17 06:08

我有一段代码,可以显示一串数字,并且会高亮当前选中的项目:

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 个回答

3

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

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

我自己写的一个什么都不做的实现可以消除这个错误,但这样做也完全搞乱了所有的按键绑定。

我找到这个方法,似乎运行得很好:

class SelectableText(urwid.Edit):
    def valid_char(self, ch):
        return False
1

列表框中的项目需要可以被选中。这里有一种方法:

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

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

撰写回答