【问题标题】:Kivy: cant get scroll_to in Scrollview workingKivy:无法在 Scrollview 工作中获取 scroll_to
【发布时间】:2025-12-04 23:45:01
【问题描述】:

尝试这样的代码我让 Scrollview 工作得很好,但 scroll_to() 函数没有做任何事情。视图仍从顶部位置开始。

pixperhour = 60
tagHL = []

dayview = ScrollView(size_hint=(1,1))
test = BoxLayout(size_hint=(1,None), height=24*pixperhour, orientation='vertical')
dayview.add_widget(test)

for i in range(24):
    tagHL.append(Label())
    test.add_widget(tagHL[i])
    tagHL[i].text = "Label "+str(i)
    tagHL[i].color = (1, 1, 1)
    tagHL[i].font_size = 30

dayview.scroll_to(tagHL[12])

我希望滚动视图的视口会发生变化,以便标签 tagHL[12] 变得可见。是我做错了还是功能有问题?

【问题讨论】:

  • 尝试安排或将其绑定到由Button 等小部件触发的操作。
  • 我使用一个按钮触发了它,这很有效。当然,我希望它是自动的。我可以将它绑定到什么样的事件?

标签: python kivy scrollview boxlayout js-scrollto


【解决方案1】:

为了在小部件创建完成后立即实现,您可以将其安排在某个(或不)时间之后(或之前),如 Clock.schedule_once(lambda *args : dayview.scroll_to(tagHL[12]),dt) 其中dt 可以是 -1、0 或任何正值。

附带说明,如果您将tagHL 用作小部件容器,那么最好使用BoxLayouttestchildren 属性。所以,就像,

    for i in range(24):
        self.lbl = Label(
            text=f"Label {i}",
            color = [1, 1, 1],
            font_size = 30,
        )
        test.add_widget(self.lbl)
    Clock.schedule_once(lambda *x : dayview.scroll_to(test.children[::-1][12]))

【讨论】:

  • 这似乎一直有效。 [::-1] 位有什么作用?
  • 当我尝试使用 for 循环在滚动视图数组上使用 scroll_to() 函数时,我现在遇到了另一个障碍。使用上面示例中的确切语法不起作用。当我使用单独的时间值时,例如 Clock.schedule_once(lambda *x: dayview.scroll_to(test.children[::-1][12]), i*0.1) ,其中 i 是循环变量,它只会更新最后一个滚动视图的视图。
  • 刚刚复制并粘贴同一行 i 次,一切正常。
  • 每个Widget 都有一个名为children 的属性,一个list 包含它的子小部件(如果有的话)。它们一个接一个地插入,所以第一个添加的小部件 (index=-1) 将位于堆栈的底部,最后添加的小部件 (index=0) 将位于顶部。现在,如果您想按添加的顺序处理它们(即首先添加:0,其次是:1,等等),一种方法如上所述,即反转我们通常通过切片 [::-1 执行的列表].
  • 第二个查询:这取决于您如何设置持续时间。