使用Kivy在ScrollView中使用RST文档

时间:2016-07-19 02:43:17

标签: python kivy

我有点陷入困境。在使用Kivy的ScrollView布局和(当前实验)reStructuredText渲染器模块时,我遇到了一个小问题。每当我运行我的代码时,我的终端都会惹恼我:

[CRITICAL] [Clock] Warning, too much iteration done before the next frame. Check your code, or increase the Clock.max_iteration attribute

现在,应用程序似乎运行得非常好,直到您在ScrollView布局中找到包含rST Document的页面。那个页面做了各种奇怪的事情。主滚动视图将永远慢慢向下滚动,从页面尾随白色,rST文档奇怪地放置,稍微向左移动。

当我删除文档时,屏幕和应用程序表现完全正常,运行顺畅。有没有人知道如何解决这个问题,以使页面正常工作? (我是否提到rST文档最初是在旋转木马中,但我拿出旋转木马来查看是否存在问题。) 这是Kivy语言代码:

<Page>:
    orientation: 'vertical'
    ScrollView:
        size_hint: (.99, .99)
        StackLayout:
            size_hint_y: None
            id: content_layout
            height: self.minimum_height
            WrappedLabel:
                text: "Test"
                font_size: min(root.height, root.width)
            RstDocument:
                underline_color: 'blue'
                text:("Some Text")

问题是rST文档是否基于ScrollView布局?

1 个答案:

答案 0 :(得分:0)

有时height: self.minimum_height和类似的东西就像用脚射击自己。绝对要先尝试对这些事情进行评论,因为如果你不做一些花哨的事情,那么尺寸就是问题。

现在,为什么这是一个问题? StackLayoutminimum_height设置为minimum_size,设置为here,并且有一些零的初始值。

不要混淆,minimum_height在开始时确实默认为零,但随后可能会在每个添加的小部件上重新计算。如果您在on_height: print(self.height)之后添加height: self.minimum_height,则会明白我的意思。

为什么这样做呢?简单!您没有为这些孩子设置绝对大小(每个孩子都有size_hint == [1, 1])。

另外,ScrollView如果我没记错的话,期望ScrollView的大小(以便滚动)。

from kivy.lang import Builder
from kivy.base import runTouchApp
from kivy.uix.boxlayout import BoxLayout
Builder.load_string('''
<Test>:
    orientation: 'vertical'
    ScrollView:
        size_hint: (.99, .99)
        StackLayout:
            size_hint_y: None
            id: content_layout
            height: self.minimum_height
            on_height: print(self.height)
            Label:
                size_hint: None, None
                size: 100, 30
                text: "Test"
                font_size: min(root.height, root.width)
            RstDocument:
                size_hint: None, None
                size: 100, 1000
                underline_color: 'blue'
                text:("Some Text")
''')
class Test(BoxLayout): pass
runTouchApp(Test())

从子项中删除size_hintsize,然后在那里too much iteration