2013-10-21 30 views
4

是否可以將ListBox放入SimpleListWalkers中?我試圖讓嵌套列表框,但我有此錯誤:如何在urwid中創建嵌套列表框?

AttributeError: 'MyListBox' object has no attribute '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() 

回答

6

根據the manualListBox是一個盒子的小工具,包含內部流部件。

窗口小部件類型(框,流和固定)之間的區別在於計算它們大小的方法。詳細信息在上述鏈接中介紹。簡而言之:ListBox被告知其容器的大小,但要求其子女自己計算其高度。作爲另一個ListBox是在裏面它不能提供這個值(沒有rows方法)。

的解決方案是包裝在BoxAdapterListBox,使框部件的外觀和行爲像流插件:

... 
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)])) 
...