gpt4 book ai didi

python - 如何使用 urwid 确定列表框中可见项目的数量?

转载 作者:太空宇宙 更新时间:2023-11-03 14:07:51 25 4
gpt4 key购买 nike

我想实现一些提示,以确定当我向上或向下滚动时 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

最佳答案

因此,这是通过子类化 urwid.ListBox 来实现此目的的一种方法,我们可以添加一个属性 all_children_visible ,该属性在我们知道小部件的大小时设置(即,当渲染或处理输入事件时)。

示例代码,基于您提供的示例:

import string
import urwid

class MyListBox(urwid.ListBox):
all_children_visible = True

def keypress(self, size, *args, **kwargs):
self.all_children_visible = self._compute_all_children_visible(size)
return super(MyListBox, self).keypress(size, *args, **kwargs)

def mouse_event(self, size, *args, **kwargs):
self.all_children_visible = self._compute_all_children_visible(size)
return super(MyListBox, self).mouse_event(size, *args, **kwargs)

def render(self, size, *args, **kwargs):
self.all_children_visible = self._compute_all_children_visible(size)
return super(MyListBox, self).render(size, *args, **kwargs)

def _compute_all_children_visible(self, size):
n_total_widgets = len(self.body)
middle, top, bottom = self.calculate_visible(size)
n_visible = len(top[1]) + len(bottom[1])
if middle:
n_visible += 1
return n_total_widgets == n_visible

def callback():
debug.set_text(
"Are all children visible? {}\n".format(listbox.all_children_visible)
)


captions = list(string.uppercase + string.lowercase)

# uncomment this line to test case of all children visible:
# captions = list(string.uppercase)

debug = urwid.Text("Debug")
items = [urwid.Button(caption) for caption in captions]
walker = urwid.SimpleListWalker(items)
listbox = MyListBox(walker)
urwid.connect_signal(walker, "modified", callback)
frame = urwid.Frame(body=listbox, header=debug)
urwid.MainLoop(frame).run()

我不确定它的性能如何(我没有对其进行广泛的测试),所以我很好奇这对于您的情况将如何执行 - 让我知道它是如何进行的。 :)

关于python - 如何使用 urwid 确定列表框中可见项目的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737120/

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