python - urwid 简单列表框示例
我正在研究urwid来开发一个控制台应用程序。作为一个起点,我想找一个简单的例子,展示一个可以用上下键滚动的列表框,里面有几行内容。
有没有人能提供一个简单的例子,或者给我一个链接?我看过urwid网站上的例子,但我想要一些更基础的内容。
编辑
@Adam:我在网上找到了这个例子。不过我在注释掉的部分遇到了困难,因为我对这个API不太熟悉,而且我还是个Python新手。
编辑2
我搞明白了,并更新了这个例子。还有一个问题 - 我能直接从ListBox获取项目数量吗?
import urwid
palette = [('header', 'white', 'black'),
('reveal focus', 'black', 'dark cyan', 'standout')]
items = [urwid.Text("foo"),
urwid.Text("bar"),
urwid.Text("baz")]
content = urwid.SimpleListWalker([
urwid.AttrMap(w, None, 'reveal focus') for w in items])
listbox = urwid.ListBox(content)
show_key = urwid.Text("Press any key", wrap='clip')
head = urwid.AttrMap(show_key, 'header')
top = urwid.Frame(listbox, head)
def show_all_input(input, raw):
show_key.set_text("Pressed: " + " ".join([
unicode(i) for i in input]))
return input
def exit_on_cr(input):
if input in ('q', 'Q'):
raise urwid.ExitMainLoop()
elif input == 'up':
focus_widget, idx = listbox.get_focus()
if idx > 0:
idx = idx-1
listbox.set_focus(idx)
elif input == 'down':
focus_widget, idx = listbox.get_focus()
idx = idx+1
listbox.set_focus(idx)
def out(s):
show_key.set_text(str(s))
loop = urwid.MainLoop(top, palette,
input_filter=show_all_input, unhandled_input=exit_on_cr)
loop.run()
2 个回答
0
我可以直接从列表框中获取项目数量吗?
这样做会选中很多项目
listbox.get_focus_widgets()
这样做会得到选中的索引和文本
listbox.focus_position
listbox.focus.base_widget.text
0
列表框(listbox)在它的主体属性里面共享了一个叫做 SimpleListWalker 的东西,幸运的是,这个东西正确地实现了 len 这个功能。
len(listbox.body)
还有更多的证据:
(Pdb) listbox.body
SimpleListWalker([<AttrMap flow widget <Text flow widget 'Chemma!'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Divider flow widget div_char='-'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Text flow widget 'Another text widget!'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Divider flow widget div_char='-'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Text flow widget 'What is your name'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Divider flow widget div_char='-'> attr_map={None: None} focus_map={None: 'line'}>, <AttrMap flow widget <Text flow widget 'Boy ?'> attr_map={None: None} focus_map={None: 'line'}>])
(Pdb) len(listbox.body)
7
(Pdb)