Python киви два GridLayouts и Screen Menager

У меня есть два приложения в киви. Оба были основаны на GridLayout. Я нашел похожую проблему, но я не понимаю: связывание экранов с классами GridLayout в kivy.

В .py:

import kivy
kivy.require("1.9.0")
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
from kivy.app import App
from kivy.uix.gridlayout import GridLayout

class FirstScreen(GridLayout):
    #some methods
class SecondScreen(GridLayout):
    #some methods

В .кв

<FirstScreen>:
    id: sterowanie_serv
    display: entry
    rows: 10
    padding: 10
    spacing: 10
    BoxLayout:
        spacing: 20
        CustButton:
            text:'1'
            on_press: do method from second screen class
        CustButton:
            text:'x'
            on_press: do method from second screen class
        CustButton:
            text:'go to Second screen'
            on_press: root.manager.current = 'SecondScreen'

<SecondScreen>:
    id: Przemo
    display: entry
    rows: 5
    padding: 10
    spacing: 10
    BoxLayout:
        spacing: 20
        CustButton:
            text:'1'
            on_press: do method from second screen class
        CustButton:
            text:'x2'
            on_press: do method from second screen class
        CustButton:
            text:'go to First screen'
            on_press: root.manager.current = 'SecondScreen'

Как использовать диспетчер экрана для первого отображения первого экрана и нажатия на кнопку " Второй экран"?

В итоге будет:

on_press: 
    root.manager.current = 'SecondScreen'

1 ответ

Решение

ScreenManager принимает только Screen виджеты. FirstScreen а также SecondScreen должен быть Screen случаи, они не могут быть GridLayouts, внутри FirstScreen а также SecondScreen где вы должны создать GridLayouts.

С другой стороны, ScreenManager.current Атрибут - это имя отображаемого в данный момент экрана. Вам нужно установить атрибут имени в ваших окнах.

Пример на основе вашего кода:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

kv_text = """\
#:import WipeTransition kivy.uix.screenmanager.WipeTransition
<MainScreen>:
    transition: WipeTransition()
    id: sm
    FirstScreen:
    SecondScreen:

<FirstScreen>:
    name: "first_screen"
    GridLayout:
        id: sterowanie_serv
        rows: 10
        padding: 10
        spacing: 10
        BoxLayout:
            spacing: 20
            Button:
                text:'1'
                on_press: print(app.root)
            Button:
                text:'x'
                on_press: print('Button X')
            Button:
                text:'go to Second screen'
                on_press: app.root.current = 'second_screen'

<SecondScreen>:
    name: "second_screen"
    GridLayout:
        id: Przemo
        rows: 5
        padding: 10
        spacing: 10
        BoxLayout:
            spacing: 20
            Button:
                text:'1'
                on_press: print('Button 1')
            Button:
                text:'x2'
                on_press: print('Button X2')
            Button:
                text:'go to First screen'
                on_press: app.root.current = 'first_screen'
"""

class MainScreen(ScreenManager):
    def __init__(self):
        super(MainScreen, self).__init__()

class FirstScreen(Screen):
    #some methods
    pass

class SecondScreen(Screen):
    #some methods
    pass

class MyKivyApp(App):
    def build(self):
        return MainScreen()

def main():
    Builder.load_string(kv_text)
    app = MyKivyApp()
    app.run()

if __name__ == '__main__':
    main()

Бегущий пример:

Другие вопросы по тегам