如何在Python中让ScrollView回到屏幕顶部

5
我在我的应用程序中重复使用屏幕。第一次返回到以前的屏幕时,滚动会重置到顶部,但第三次或之后不会发生重置。
我正在设计一个应用程序,用户可以通过单击屏幕一上的按钮从选项列表中选择。根据他们点击的选项,不同的信息列表将显示在屏幕二上。由于信息和按钮数目是动态的,因此我需要在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个回答

9

您的代码中的 ScrollView.scroll_y=1 不会产生任何作用,因为它是在类 ScrollView 上设置一个值,而不是在您正在显示的任何实例上设置值。

请尝试在 add_buttons 方法的结尾添加以下内容:self.ids.scrollview.scroll_y = 1 (您也可以在 add_labels 方法的结尾添加相同的代码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接