Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-urwid简单列表框示例_Python_Shell_Console_Urwid - Fatal编程技术网

python-urwid简单列表框示例

python-urwid简单列表框示例,python,shell,console,urwid,Python,Shell,Console,Urwid,我正在考虑urwid开发一个控制台应用程序。作为一个起点,我正在寻找一个列表框的简单示例,该列表框显示可以使用向上/向下键滚动的几行 谁能提供一个简单的例子来说明如何做到这一点,或者给我一个链接?我在urwid网站上看到了这些例子,但我正在寻找一些更基本的东西 编辑 @亚当:我在网上找到了这个例子。我对注释掉的部分有困难,因为我不熟悉API,而且我是python新手 编辑2 我找到了答案并更新了示例。 还有一个问题-我可以直接从列表框中获取项目计数吗 import urwid palette

我正在考虑urwid开发一个控制台应用程序。作为一个起点,我正在寻找一个列表框的简单示例,该列表框显示可以使用向上/向下键滚动的几行

谁能提供一个简单的例子来说明如何做到这一点,或者给我一个链接?我在urwid网站上看到了这些例子,但我正在寻找一些更基本的东西

编辑

@亚当:我在网上找到了这个例子。我对注释掉的部分有困难,因为我不熟悉API,而且我是python新手

编辑2 我找到了答案并更新了示例。 还有一个问题-我可以直接从列表框中获取项目计数吗

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()

列表框在其body属性中共享SimpleListWalker,幸运的是,该属性正确地实现了len

透镜体

进一步证据:

(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) 

列表框在其body属性中共享SimpleListWalker,幸运的是,该属性正确地实现了len

透镜体

进一步证据:

(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) 

你能指出你有什么问题吗?你能指出你有什么问题吗?