Kivy 滚动浏览数千行文本

Posted

技术标签:

【中文标题】Kivy 滚动浏览数千行文本【英文标题】:Kivy scrolling through thousands of lines of text 【发布时间】:2014-12-29 17:09:54 【问题描述】:

所以我正在开发一个基于 kivy 的应用程序,我希望能够滚动浏览数千行文本。我开始尝试使用基本的滚动视图,但是当您有大量文本时,这根本不起作用(据我所知)。事实上,当我创建一个非常大的标签时,它往往根本不渲染。

然后,我尝试创建自己的小部件来滚动文本,方法是创建一个显示我想要显示的整个文本的子集的标签,然后遍历这些行,所以它就像在终端中滚动一样.我现在遇到的问题是我无法弄清楚如何让标签在同一个地方保持相同的大小。我设置了大小和 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”设置为中心(尽管数字并不完全表明这一点),因此根据线长,纹理大小和位置会发生变化。

【问题讨论】:

你能提供一些代码来澄清这种情况吗? 尝试将只读设置为 True 的 TextInput 怎么样?我不知道它是否会起作用……也许值得一试。此外,您可能不应该同时使用 size 和 size_hint,以防万一。例如,如果您使用 size,则将 size_hint 设置为 (None, None) 否则可能会影响大小。 好的,我添加了更多信息和代码。让我知道我是否还能做其他事情。我没有在同一个项目上使用 size 和 size_hint,但我都试过了。如果您认为 textinput 会更好,我会尝试(稍后),但我很确定我只是无法掌握小部件在 kivy 中的定位方式,而文本输入无济于事。 也许可以看看这些:kivy.org/docs/api-kivy.core.text.text_layout.html - 以前从未见过 textlayout,听起来维护得不太好,但可能会有所帮助。我假设你已经扫描了标签 api,如果没有的话,有几个方法看起来可以派上用场,也许是一些 padding 和 split_str kivy.org/docs/api-kivy.uix.label.html 的用法 您的代码看起来不像我以前见过的任何 kivy 实现,我感觉您没有很好地阅读文档。我建议做一些教程。例如,您在 kv 文件中的标签没有任何尺寸并且看起来非常可疑的定位。在这里设置 x 似乎不合适。特别是缺乏定位很可能会导致您的问题。如果这仍然是一个问题,我明天会在这里发布,因为我现在没有时间,但请全部谷歌。 【参考方案1】:

我觉得你应该试试 thopiekar 在 github 上的建议:https://github.com/openBergisch/kivy-widget-playground/issues/1

在 ScrollView 中使用 MultiLineLabel 应该可以解决您的问题。

【讨论】:

【参考方案2】:
<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

如果您将 text 属性设置为文件的内容,则此方法效果很好,但应手动处理 textinput 的大小调整。最后一行通过on_text 属性事件显示了如何。

【讨论】:

以上是关于Kivy 滚动浏览数千行文本的主要内容,如果未能解决你的问题,请参考以下文章

完美解决EditText和ScrollView的滚动冲突(上)

Kivy 滚动条滚动方向与鼠标

(垂直)滚动视图包含另一个(水平)滚动视图 - Kivy

KIVY:缺少滚动条

在kivy中禁用弹跳滚动效果

Kivy Scrollview 自动滚动到新文本。防止向上滚动