所以我正在开发一个基于 kivy 的应用程序,我希望能够滚动浏览数千行文本。我开始尝试使用基本的滚动视图,但当你有大量文本时,这根本不起作用(据我所知)。事实上,当我创建一个非常大的标签时,它往往根本不渲染。
然后,我尝试创建自己的小部件来滚动文本,方法是基本上制作一个标签,显示我想要显示的整个文本的子集,然后迭代这些行,所以这就像在终端中滚动一样。我现在遇到的问题是我不知道如何让标签在同一位置保持相同的尺寸。我设置了 size 和 size_hint 但它们都不起作用。 text_size 似乎有点工作,但我有一个问题,文本根据行长度水平跳跃,有时标签似乎集中在我设置的 x 位置上,而不是将该位置设置为左侧边缘。我已经尝试明确地左对齐文本,但也没有效果。我正在尝试在浮动布局中执行此操作。
如果有人能解释我如何使用 kivy 滚动浏览大量文本,我将非常感激。谢谢
编辑:添加一些代码
Label:
id: scroll_label_text
font_size: 18
text: "log here"
x:800
这是在 kv 文件中的标签,我用来显示我想要滚动的文本
log_text = ObjectProperty(Label)
scroll_down = ObjectProperty(Button)
scroll_up = ObjectProperty(Button)
scrollpos = 0
def __init__(self, log, **kwargs):
super(Reader,self).__init__()
self.scroll_down.bind(on_press=self.scroll)
self.scroll_up.bind(on_press=self.scroll)
self.log_text.y = self.scroll_down.height*2
self.log_text.text_size = (None,300)
self.log_text.shorten = True
因此,我可以通过简单地更改标签中显示的文本片段来上下滚动按钮。
我遇到的问题是我无法将标签保留在屏幕的左侧。它似乎以“x”设置为中心(尽管数字并不完全表明这一点),因此根据线条长度,纹理大小和位置会发生变化。
我认为你应该尝试 github 上 thopiekar 的建议:https://github.com/openBergisch/kivy-widget-playground/issues/1
在 ScrollView 中使用 MultiLineLabel,你的问题应该可以解决。
<StackLayout>:
id:rootpane
textpane:textpane
scroll:scroll
direction:'tb-lr'
size_hint:(None, None)
size:(480, 854)
pos:self.parent.pos
ScrollView:
id:scroll
size_hint:(None, None)
size:rootpane.size
#do_scroll_x:False
#do_scroll_y:False
bar_color:(0, 0, 0, 0.4)
bar_inactiv_color:(0, 0, 0.7, 0.4)
bar_margin:2
bar_width:8
#on_scroll_x:textpane.focus = True
#on_scroll_y:textpane.focus = True
TextInput:
size_hint:(None, None)
id:textpane
text:''
on_text:self.y = self.minimum_height
如果将文本属性设置为文件的内容,则效果很好,但需要手动处理
textinput
的大小调整。最后一行显示了如何通过 on_text
属性事件。
作为将来任何人的注意事项,请确保检查您正在使用的
Label
的纹理大小。 这篇文章。渲染器讨厌 Label 处理大量信息,并且您的 Label
可能会变成空白/黑色,但仍然可以滚动。截至今天我仍然没有找到一个好的解决方案,并且具有只读属性的TextInput
似乎很慢。