Urwid raising (maxcol,) = size too many values to unpack
Urwid raising (maxcol,) = size too many values to unpack
我正在尝试为机器人创建一个 Urwid UI。我想到的布局是由三个水平区域组成的:
- 一条内衬消息(例如“按下了未知键”)
- 运行 日志消息(机器人中发生的任何事情)
- 我希望始终显示的观察变量
我创建了这段代码,得到了布局截图:
brief_message = urwid.Text(u'Robot starting...')
log_messages = urwid.Text('running log messages here')
variables = urwid.Text('k=v variable list here')
body = urwid.Pile([
#urwid.Filler(brief_message, height=1),
urwid.LineBox(urwid.Filler(log_messages, valign='bottom', top=1)),
urwid.LineBox(urwid.Filler(variables, valign='top', bottom=1)),
])
loop = urwid.MainLoop(body)
loop.run()
问题是,如果我取消注释 urwid.Filler(brief_message, height=1)
行,我会得到一个异常,我不确定为什么:
[ full traceback snipped ]
File "/tmp/venv/lib/python3.8/site-packages/urwid/widget.py", line 1001, in render
(maxcol,) = size
ValueError: too many values to unpack (expected 1)
我 understand 发生这种情况是因为流小部件被视为框小部件,但我认为用 urwid.Filler
包装 brief_message
正是我应该做的。此外,如果我从 Filler 中删除 height=1
,程序可以运行,但 brief_message
的高度是屏幕的三分之一,这不是我想要的 - 它应该是一个单行。
我错过了什么?
查看 urwid.Filler
的 documentation 它说:
If body is a flow widget then height must be 'flow' and min_height will be ignored.
如果您使用 urwid.Text
之类的流量小部件作为正文,则不能将高度设置为 1 或流量以外的任何值。
就实际获得您正在寻找的结果而言,以下是我的最佳猜测。我没有设置合适的测试环境所以 YMMV。
查看 Pile 的 documentation,您可以传递具有高度值的元组,它将被视为一个框小部件。所以你可以试试
body = urwid.Pile([
(1, urwid.Filler(brief_message)),
urwid.LineBox(urwid.Filler(log_messages, valign='bottom', top=1)),
urwid.LineBox(urwid.Filler(variables, valign='top', bottom=1)),
])
我正在尝试为机器人创建一个 Urwid UI。我想到的布局是由三个水平区域组成的:
- 一条内衬消息(例如“按下了未知键”)
- 运行 日志消息(机器人中发生的任何事情)
- 我希望始终显示的观察变量
我创建了这段代码,得到了布局截图:
brief_message = urwid.Text(u'Robot starting...')
log_messages = urwid.Text('running log messages here')
variables = urwid.Text('k=v variable list here')
body = urwid.Pile([
#urwid.Filler(brief_message, height=1),
urwid.LineBox(urwid.Filler(log_messages, valign='bottom', top=1)),
urwid.LineBox(urwid.Filler(variables, valign='top', bottom=1)),
])
loop = urwid.MainLoop(body)
loop.run()
问题是,如果我取消注释 urwid.Filler(brief_message, height=1)
行,我会得到一个异常,我不确定为什么:
[ full traceback snipped ]
File "/tmp/venv/lib/python3.8/site-packages/urwid/widget.py", line 1001, in render
(maxcol,) = size
ValueError: too many values to unpack (expected 1)
我 understand 发生这种情况是因为流小部件被视为框小部件,但我认为用 urwid.Filler
包装 brief_message
正是我应该做的。此外,如果我从 Filler 中删除 height=1
,程序可以运行,但 brief_message
的高度是屏幕的三分之一,这不是我想要的 - 它应该是一个单行。
我错过了什么?
查看 urwid.Filler
的 documentation 它说:
If body is a flow widget then height must be 'flow' and min_height will be ignored.
如果您使用 urwid.Text
之类的流量小部件作为正文,则不能将高度设置为 1 或流量以外的任何值。
就实际获得您正在寻找的结果而言,以下是我的最佳猜测。我没有设置合适的测试环境所以 YMMV。
查看 Pile 的 documentation,您可以传递具有高度值的元组,它将被视为一个框小部件。所以你可以试试
body = urwid.Pile([
(1, urwid.Filler(brief_message)),
urwid.LineBox(urwid.Filler(log_messages, valign='bottom', top=1)),
urwid.LineBox(urwid.Filler(variables, valign='top', bottom=1)),
])