小能豆

使用 Kivy 在 ScrollView 中使用 RST 文档

py

我有点为难。在使用 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 文档的页面。该页面会出现各种奇怪的情况。主滚动视图将缓慢向下滚动,直到页面变白,并且 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 布局?


阅读 5

收藏
2024-12-21

共1个答案

小能豆

有时height: self.minimum_height类似的事情就像搬起石头砸自己的脚。一定要先尝试注释掉这些内容,因为如果您不做一些花哨的事情,那么尺寸就是问题所在。

现在,为什么这是一个问题?StackLayout它的minimum_height集合来自minimum_size,我认为它是在这里某处设置的,并且具有某个非零的初始值。

不过不要混淆,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孩子。

2024-12-21