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

How to get ScrollView to reset to the top of the screen in python

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

我正在设计一个应用程序,用户可以通过单击第一个屏幕上的按钮从选项列表中进行选择。根据他们点击的是哪个,不同的信息列表将显示在第二个屏幕上。我需要在 python 中添加按钮和标签,因为按钮的信息和数量是动态的。我不知道如何将滚动条重置到屏幕顶部。我在按下按钮后 运行s 的函数中添加了一行 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

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

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