微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Urwid raise (maxcol,) = 大小太多无法解包

如何解决Urwid raise (maxcol,) = 大小太多无法解包

我正在尝试为机器人创建 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()

screenshot of resulting layout

问题是,如果我取消注释 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 发生这种情况是因为流小部件被视为盒子小部件,但我认为用 brief_message 包装 urwid.Filler 正是我应该做的。此外,如果我从 Filler 中删除 height=1,程序可以运行,但 brief_message 的高度是屏幕的三分之一,这不是我想要的 - 它应该是一个单行。

我错过了什么?

解决方法

查看 urwid.Fillerdocumentation 它说:

如果 body 是一个流小部件,那么高度必须是 'flow' 并且 min_height 将被忽略。

如果您使用像 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)),])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。