【发布时间】:2018-02-11 22:23:08
【问题描述】:
当我向上或向下滚动 urwid.ListBox 中的可见项目列表时,我想实现一些提示,即是否还有项目低于或高于可见项目列表。 '向下滚动' 提示应该只在最后一个可见项目之后有剩余项目时出现,并且当最后一个可见项目是列表中的最后一个项目时它应该消失。反向适用于“向上滚动”提示。
然后我需要知道列表中有多少可见项目。有没有办法检索列表框中可见项目的数量,我想它等于列表框的高度,对吧?
这是我要检查的起点:
# This example is based on https://cmsdk.com/python/is-there-a-focus-changed-event-in-urwid.html
import urwid
def callback():
index = str(listbox.get_focus()[1])
debug.set_text("Index of selected item: " + index)
captions = "A B C D E F".split()
debug = urwid.Text("Debug")
items = [urwid.Button(caption) for caption in captions]
walker = urwid.SimpleListWalker(items)
listbox = urwid.ListBox(walker)
urwid.connect_signal(walker, "modified", callback)
frame = urwid.Frame(body=listbox, header=debug)
urwid.MainLoop(frame).run()
这个想法是要知道当终端窗口缩小或不够高以显示所有内容时,列表框是否在框架内完全可见,即frame.height >= listbox.height。
【问题讨论】:
-
您能否分享一个您已经尝试过的代码的最小示例?
-
@elias 没问题。完成。
-
当我开始了解 urwid 的工作原理时,我希望在派生 ListBox 类之前无法解决这个问题,因为除非绘制组件,否则无法确定高度。大多数(如果不是全部)绘图方法都涉及大小参数,所以我想这就是交易,对吧?
-
对,ListBox 有一个需要大小的
calculate_visible方法,所以我认为可以创建一个覆盖渲染方法的子类来调用它并设置一个属性来说明是否有项目不可见...我会尽快尝试 :) -
关于隐藏列表条目的可视化,我在this answer中描述了一个可能的解决方案。