【问题标题】:In urwid 'Frame' object has no attribute 'rows'在 urwid 'Frame' 对象中没有属性 'rows'
【发布时间】:2020-11-23 02:16:34
【问题描述】:

我正在寻找任何简单的方法让urwid.Frame 在 python 中工作但没有成功,例如,我试试这个 MWE:

frame  = urwid.Frame(urwid.Text(('some text'), align='center'))
filler = urwid.Filler(frame, "top")
loop   = urwid.MainLoop(filler)
loop.run()

我收到以下无用的错误消息:

Traceback (most recent call last):
  File "pycurses.py", line 596, in <module>
    loop.run()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 287, in run
    self._run()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 385, in _run
    self.event_loop.run()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 790, in run
    self._loop()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 818, in _loop
    self._entering_idle()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 779, in _entering_idle
    callback()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 574, in entering_idle
    self.draw_screen()
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/main_loop.py", line 588, in draw_screen
    canvas = self._topmost_widget.render(self.screen_size, focus=True)
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/widget.py", line 145, in cached_render
    canv = fn(self, size, focus=focus)
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/decoration.py", line 814, in render
    top, bottom = self.filler_values(size, focus)
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/decoration.py", line 799, in filler_values
    height = self._original_widget.rows((maxcol,),focus=focus)
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/widget.py", line 205, in cached_rows
    return fn(self, size, focus)
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/container.py", line 1611, in rows
    return sum(self.get_item_rows(size, focus))
  File "/home/fauve/.local/lib/python3.5/site-packages/urwid/container.py", line 1512, in get_item_rows
    l.append(w.rows((maxcol,),
AttributeError: 'Frame' object has no attribute 'rows'

我尝试了许多变体,例如将框架放在 urwid.Pile 中,然后再将其提供给 Filler 小部件,但我仍然收到类似的错误消息。

那么,他们的任何极简主义示例是否工作使用urwid.Frame

这个“框架”对象没有属性“行”是什么意思?在我的示例中,我从不询问任何 .rows 方法,那么为什么错误消息的行为类似于我使用它?

【问题讨论】:

    标签: python python-3.x curses tui urwid


    【解决方案1】:

    错误确实不是很好。这里的实际问题是 Frame 和 Filler 的嵌套应该是相反的:

    import urwid
    
    text = urwid.Text('some text', align='center')
    filler = urwid.Filler(text, "top")
    frame  = urwid.Frame(filler)
    loop   = urwid.MainLoop(frame)
    loop.run()
    

    流小部件(如文本)可以决定它应该有多少行。主循环需要一个盒子小部件(它不会选择自己的宽度或高度)。 Filler 小部件连接了两者:它询问包装的流小部件它占用了多少行(给定列数),然后填充其余的行。

    Frame 是一个盒子小部件,在中心包含另一个盒子小部件。

    如果你还没有看过这个页面,我强烈建议你看看这里的图表:http://urwid.org/manual/widgets.html#included-widgets 颜色描述了什么样的小部件嵌套在什么样的小部件中。

    (我还怀疑 Urwid 检测到小部件的类型错误并在错误消息中说出来在技术上是可行的,但我还没有深入研究实现。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多