gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:02:07 29 4
gpt4 key购买 nike

是否可以将 ListBoxes 放入 SimpleListWalkers 中?我正在尝试制作嵌套的列表框,但出现此错误:

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

最佳答案

根据 the manual 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)]))
...

关于python - 如何在 urwid 中创建嵌套列表框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19500832/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com