如何让 ScrollView 在 python 中重置到屏幕顶部

Posted

技术标签:

【中文标题】如何让 ScrollView 在 python 中重置到屏幕顶部【英文标题】:How to get ScrollView to reset to the top of the screen in python 【发布时间】:2019-07-03 06:12:23 【问题描述】:

我在我的应用程序中重复使用屏幕。第一次返回上一个屏幕时,滚动条会重置到顶部,但在第三次或之后的任何时候都不会。

我正在设计一个应用程序,用户可以通过单击屏幕一上的按钮从选项列表中进行选择。根据他们点击的内容,不同的信息列表将显示在屏幕二上。我需要在 python 中添加按钮和标签,因为按钮的信息和数量是动态的。我不知道如何将滚动重置到屏幕顶部。我在按下按钮后运行的函数中添加了一行 ScrollView.scroll_y=1 。这第一次有效,但此后任何时候都无效。因此,如果您运行两次代码,屏幕将重置为顶部。但是,如果您第三次浏览它,它将不再从屏幕顶部开始。谁能告诉我是什么导致了这种行为,或者有没有人有更好的方法来使用 python 语言在按下按钮时重置屏幕?

这是我的 main.py:

import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.textinput import TextInput
from kivy.lang.builder import Builder
from kivy.uix.scrollview import ScrollView
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.screenmanager import ScreenManager, Screen

class MainScreen(Screen):
    pass
class FirstScreen(Screen):
    container=ObjectProperty(None)
    def add_buttons(self):
        self.ButtonList=[1,2,3,4,5,6,7,8,9,10]
        for i in range(0,10):
            self.ButtonList[i]=Button(text='Button '.format(i), id=str(i), size_hint=(1,None), on_press=self.switchscreens)
            self.container.add_widget(self.ButtonList[i])
    def switchscreens(self,instance):
        self.container.clear_widgets()
        self.manager.current='secondscreen'
class SecondScreen(Screen):
    container=ObjectProperty(None)
    def add_labels(self):
        self.LabelList=[1,2,3,4,5,6,7,8,9,10]
        for i in range(0,10):
            self.LabelList[i]=Label(text='Label '.format(i), id=str(i), size_hint=(1,None))
            self.container.add_widget(self.LabelList[i])
        self.SwitchBackButton=Button(text='Main Screen', id='switchbutton', size_hint=(1,None), height=30, on_press=self.switchback)
        self.container.add_widget(self.SwitchBackButton)
    def switchback(self,instance):
        ScrollView.scroll_y=1
        self.container.clear_widgets()
        self.manager.current='main'
class ScreenManagement(ScreenManager):
    pass
presentation=Builder.load_file("Switch.kv")
class SwitchApp(App):
    def build(self):
        return presentation
SwitchApp().run()

还有 Switch.kv:

ScreenManagement:
    name:'screen_manager'
    id:screenmanager
    MainScreen:
    FirstScreen:
        on_pre_enter:
            self.add_buttons()
    SecondScreen:
        on_pre_enter:
            self.add_labels()

<MainScreen>:
    id:main_screen
    name: 'main'
    ScrollView:
        id:scrollview
        name:'scrollview'
        GridLayout:
            cols:1
            padding:10
            spacing:10
            size_hint: None, None
            width:800
            height: self.minimum_height
            Label:
                text: 'Main Menu'
            Button:
                text: 'First Screen'
                size_hint: 1,None
                on_release: app.root.current= 'firstscreen'


<FirstScreen>:
    id:first_screen
    name: 'firstscreen'
    container:container
    ScrollView:
        id:scrollview
        name:'scrollview'
        GridLayout:
            id:container
            cols:1
            padding:10
            spacing:10
            size_hint: None, None
            width:800
            height: self.minimum_height

<SecondScreen>:
    id:second_screen
    name: 'secondscreen'
    container:container
    ScrollView:
        id:scrollview
        name:'scrollview'
        GridLayout:
            id:container
            cols:1
            padding:10
            spacing:10
            size_hint: None, None
            width:800
            height: self.minimum_height

【问题讨论】:

【参考方案1】:

您的行 ScrollView.scroll_y=1 没有做任何事情,因为它在类 ScrollView 上设置了一个值,而不是您在显示器中显示的任何实例。

尝试在 add_buttons 方法的末尾添加以下行:self.ids.scrollview.scroll_y = 1(您可以在 add_labels 方法的末尾添加同一行)。

【讨论】:

以上是关于如何让 ScrollView 在 python 中重置到屏幕顶部的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中制作聊天应用程序:如何让 ScrollView 在键盘出现时保持原位?

如何在 Python/Kivy 中实现 ScrollView

如何让scrollView每次滚动指定的距离,求大神帮忙

如何让 ScrollView 半透明并使其背后的内容具有交互性?

如何让我的图片填满整个 ScrollView?

ScrollView 有子视图时不滚动