Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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_Listbox_Nested_Urwid - Fatal编程技术网

Python 如何在urwid中创建嵌套列表框?

Python 如何在urwid中创建嵌套列表框?,python,listbox,nested,urwid,Python,Listbox,Nested,Urwid,是否可以将列表框放在SimpleListWalker中?我正在尝试创建嵌套列表框,但出现以下错误: AttributeError:“MyListBox”对象没有属性“行” import urwid class MyListBox(urwid.ListBox): def focus_next(self): try: self.body.set_focus(self.body.get_next(self.body.get_focus()[1])[1

是否可以将列表框放在SimpleListWalker中?我正在尝试创建嵌套列表框,但出现以下错误:

AttributeError:“MyListBox”对象没有属性“行”

import urwid

class MyListBox(urwid.ListBox):
    def focus_next(self):
        try: 
            self.body.set_focus(self.body.get_next(self.body.get_focus()[1])[1])
        except:
            pass
    def focus_previous(self):
        try: 
            self.body.set_focus(self.body.get_prev(self.body.get_focus()[1])[1])
        except:
            pass            

def handle_input(event):
    frame.header.set_text("key pressed %s" % event)
    if event == "q":
        raise urwid.ExitMainLoop
    elif event == "up":
        lb.focus_previous()
    elif event == "down" :
        lb.focus_next()        

widgets   = [urwid.AttrMap(urwid.Text(str(x)),None,"focus") for x in xrange(3)]
nested    = [urwid.AttrMap(urwid.Text(str(x)+"_sous"),None,"focus") for x in xrange(3)]
nested_lb = MyListBox(urwid.SimpleListWalker(nested))
lb        = MyListBox(urwid.SimpleListWalker(widgets+[nested_lb]))
frame     = urwid.Frame(lb,header=urwid.Text("Header"))
palette   = [("focus","dark cyan","white")]
loop      = urwid.MainLoop(frame,palette,unhandled_input = handle_input)
loop.screen.set_terminal_properties(colors=256)
loop.run()
根据
ListBox
的说法,它是一个包含流小部件的框小部件

小部件类型(box、flow和fixed)之间的区别在于计算其大小的方法。上述链接中描述了详细信息。简而言之:
ListBox
从其容器中得知其大小,但要求其子项自己计算其高度。由于另一个
列表框
在其中,因此无法提供此值(没有
方法)

解决方案是将内部的
ListBox
包装在
BoxAdapter
中,使box小部件的外观和行为与flow小部件类似:

...
widgets   = [urwid.AttrMap(urwid.Text(str(x)),None,"focus") for x in xrange(3)]
nested    = [urwid.AttrMap(urwid.Text(str(x)+"_sous"),None,"focus") for x in xrange(3)]
nested_lb = MyListBox(urwid.SimpleListWalker(nested))
lb        = MyListBox(urwid.SimpleListWalker(widgets+[urwid.BoxAdapter(nested_lb, 10)]))
...