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

6

是否可以在SimpleListWalkers中放置ListBoxes?我正在尝试制作嵌套的ListBoxes,但是出现了这个错误:

AttributeError: 'MyListBox'对象没有属性'rows'

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()
1个回答

7
根据手册ListBox是一个包含流式小部件的框部件。
各种类型的小部件(框、流和固定)之间的区别在于它们计算大小的方法。详细信息请参见上述链接。简而言之: ListBox 从其容器中获知其大小,但需要子元素自行计算其高度。由于另一个 ListBox 位于其中,因此无法提供此值(没有 rows 方法)。
解决方案是将内部的 ListBox 包装在 BoxAdapter 中,使框小部件看起来和行小部件一样,并具有相应的行为:
...
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)]))
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接