当按下kivy屏幕上的recycleview中的viewclass按钮时,如何移动到下一个屏幕?

2024-10-03 09:09:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一款在不同屏幕上包含多个舞台的应用程序,因此我选择了RecycleView作为舞台屏幕。现在,我只想通过单击RecycleView的不同按钮来访问不同的屏幕

我提供的代码不是实际的代码,但它是具有所需屏幕的部分。只需单击RV文本为“1”的按钮,帮助我访问屏幕(名称:“first”),其余我自己做

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.recycleview import RecycleView

Builder.load_string('''
<ExampleRV>:
    viewclass: 'Button'

    RecycleBoxLayout:

        size_hint_y: None
        size_hint_x: None
        pos_hint: {'x': 0,'top': 0}

        height: self.minimum_height
        width: self.minimum_width

        orientation: 'horizontal'

<Manager>:

    Screen:
        name: 'main'
        Button:
            text: "Press me"
            size_hint: 0.8, 0.2
            pos_hint: {"x":0.1, "y":0.1}
            on_release: root.current = 'next'
    Screen:
        name: 'next'
        ExampleRV:

    Screen:
        name: 'first'
        Button:
            text:'Press to go back'
            on_release:
                root.current= 'main'

''')

class ExampleRV(RecycleView):

    def __init__(self, **kwargs):
        super(ExampleRV, self).__init__(**kwargs)

        self.data = [{'text': str(x)} for x in range(1,21)]

class Manager(ScreenManager):
    pass

sm = Manager()

class myApp(App):
    def build(self):
        return sm

if __name__ == '__main__':
    myApp().run()

Tags: namefromimportselfsize屏幕mainmanager
1条回答
网友
1楼 · 发布于 2024-10-03 09:09:31

必须创建以ScreenManager为属性的自定义按钮,以及更改按钮和屏幕时按下的屏幕名称。该信息必须通过数据属性发送。考虑到上述情况,我修改了生成2个屏幕的代码:第一个和第二个与2个按钮关联:

from kivy.app import App

from kivy.lang import Builder

from kivy.properties import ListProperty

from kivy.uix.floatlayout import FloatLayout
from kivy.uix.recycleview import RecycleView
from kivy.uix.screenmanager import ScreenManager, Screen


Builder.load_string(
    """
<ManagerButton@Button>:
    manager: None
    name_screen: ""
    on_press:
        self.manager.current = self.name_screen

<ExampleRV>:
    viewclass: 'ManagerButton'

    RecycleBoxLayout:

        size_hint_y: None
        size_hint_x: None
        pos_hint: {'x': 0,'top': 0}

        height: self.minimum_height
        width: self.minimum_width

        orientation: 'horizontal'

<Manager>:
    Screen:
        name: 'main'
        Button:
            text: "Press me"
            size_hint: 0.8, 0.2
            pos_hint: {"x":0.1, "y":0.1}
            on_release: root.current = 'next'
    Screen:
        name: 'next'
        ExampleRV:
            data: [ {"text": str(i), "manager": root, "name_screen": name} for i, name in enumerate(self.screen_names, 1) ]

    Screen:
        name: 'first'
        Button:
            text:'First: Press to go back'
            on_release:
                root.current= 'main'

    Screen:
        name: 'second'
        Button:
            text:'Second: Press to go back'
            on_release:
                root.current= 'main'

"""
)


class ExampleRV(RecycleView):
    screen_names = ListProperty(["first", "second"])


class Manager(ScreenManager):
    pass


sm = Manager()


class myApp(App):
    def build(self):
        return sm


if __name__ == "__main__":
    myApp().run()

相关问题 更多 >