Держите панель инструментов при смене экранов кивы - PullRequest
0 голосов
/ 04 июня 2018

Итак, у меня есть панель инструментов, и я хочу использовать ее для переключения между экранами, но я хочу, чтобы она оставалась там, пока я свободно меняю экраны.
Если я пытаюсь поместить GridLayout в класс ScreenManagerэто дает мне ошибку, поэтому вместо этого я создаю GridLayout и встраиваю в него Screen Manager.Но, похоже, это не работает так, как я хочу.

storeapp.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout

class ScreenSwitcher(ScreenManager):
    def __init__(self, **kwargs):
        super(ScreenSwitcher, self).__init__(**kwargs)
        self.add_widget(ScreenOne(name='sone'))
        self.add_widget(ScreenTwo(name='stwo'))

class ScreenOne(Screen):
    pass

class ScreenTwo(Screen):
    pass

class MainScreen(GridLayout):
    manager = ScreenSwitcher()

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

if __name__ == "__main__":

    StoreApp().run()

store.kv

#:kivy 1.10.1

<ToolBar@BoxLayout>:
    size_hint_y: None
    height: 35
    pos_hint: {'top': 1, 'y': 0}
    padding: 5,2,5,2
    spacing: 5

    canvas:
        Color:
            rgba: .7, 1, .7, 1
        Rectangle:
            pos: self.pos
            size: self.size

<ToolButton@Button>:
    color: 0,0,0,1
    align: 'center'

<ScreenOne>:
    Label:
        text: 'SCREEN ONE'
        font_size:50

<ScreenTwo>:
    Label:
        text: 'SCREEN TWO'
        font_size:50

<MainScreen>:
    rows: 2
    size_hint: 1, 1

    ToolBar:
        ToolButton:
            text: 'Screen one'
            on_press:
                root.manager.current = 'sone'

        ToolButton:
            text: 'Screen two'
            on_press:
                root.manager.current = 'stwo'

    ScreenSwitcher:

ПРОБЛЕМА: два экранапересекаются, и нажатие кнопок ничего не меняет.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Проблема

Приложение Kivy не переключает экран, поскольку существует два экземпляра ScreenSwitcher .Один экземпляр был создан в файле kv ScreenSwitcher:.Второй экземпляр был создан в скрипте Python с помощью manager = ScreenSwitcher().

Событие кнопки on_press ссылалось на второй экземпляр ScreenSwitcher .

Решение

store.py

  1. Добавить from kivy.properties import ObjectProperty.
  2. Заменить manager = ScreenSwitcher() на manager = ObjectProperty(None)

class MainScreen(GridLayout):
    manager = ObjectProperty(None)

store.kv

  1. Добавить manager: manager после <MainScreen>:.Это для подключения ObjectProperty к ScreenSwitcher id.
  2. Добавить id: manager после ScreenSwitcher:

<MainScreen>:
    manager: manager
    rows: 2
    size_hint: 1, 1

    ...

    ScreenSwitcher:
        id: manager

Пожалуйста, обратитесь к примеру и выводу для деталей.

Пример

store.py

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class ScreenOne(Screen):
    pass


class ScreenTwo(Screen):
    pass


class MainScreen(GridLayout):
    manager = ObjectProperty(None)


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


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

store.kv

#:kivy 1.10.1

<ToolBar@BoxLayout>:
    size_hint_y: None
    height: 35
    pos_hint: {'top': 1, 'y': 0}
    padding: 5,2,5,2
    spacing: 5

    canvas:
        Color:
            rgba: .7, 1, .7, 1
        Rectangle:
            pos: self.pos
            size: self.size

<ToolButton@Button>:
    color: 0,0,0,1
    align: 'center'

<ScreenOne>:
    Label:
        text: 'SCREEN ONE'
        font_size:50

<ScreenTwo>:
    Label:
        text: 'SCREEN TWO'
        font_size:50

<MainScreen>:
    manager: manager
    rows: 2
    size_hint: 1, 1

    ToolBar:
        ToolButton:
            text: 'Screen one'
            on_press:
                root.manager.current = 'sone'

        ToolButton:
            text: 'Screen two'
            on_press:
                root.manager.current = 'stwo'

    ScreenSwitcher:
        id: manager

Выход

Img01 - App Startup Img02 - ScreenTwo

0 голосов
/ 04 июня 2018

Здесь есть решение: Python Kivy screen manager wiget scope

Но я только что обнаружил, что там нет простых для понимания объяснений для начинающих, как это сделать, поэтому здесьэто идет мое:

Python файл:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout

class ScreenSwitcher(ScreenManager):
     #The screens can be added on the __init__ method like this or on the .kv file
    def __init__(self, **kwargs):
        super(ScreenSwitcher, self).__init__(**kwargs)
        self.add_widget(ScreenOne(name='sone'))
        self.add_widget(ScreenTwo(name='stwo'))

#Can be moved to another file, but needs to be imported
class ScreenOne(Screen):
    pass

#Can be moved to another file, but needs to be imported
class ScreenTwo(Screen):
    pass

class MainScreen(GridLayout):
    pass

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

if __name__ == "__main__":

    StoreApp().run()

KIVY файл:

#:kivy 1.10.1

<ToolBar@BoxLayout>:
    size_hint_y: None
    height: 35
    pos_hint: {'top': 1, 'y': 0}
    padding: 5,2,5,2
    spacing: 5

    canvas:
        Color:
            rgba: .7, 1, .7, 1
        Rectangle:
            pos: self.pos
            size: self.size

<ToolButton@Button>:
    color: 0,0,0,1
    align: 'center'

#Can be moved to another file if included with #:include filename.kv
<ScreenOne>:
    Label:
        text: 'SCREEN ONE'
        font_size:50

#Can be moved to another file if included with #:include filename.kv
<ScreenTwo>:
    Label:
        text: 'SCREEN TWO'
        font_size:50

#GridLayout used to separate the toolbar from the App's screens
<MainScreen>:
    rows: 2
    size_hint: 1, 1

    ToolBar:
        ToolButton:
            text: 'Screen one'
            on_press:
                root.ids.SS.current = 'sone'
                #Use root.ids to find the ID of your ScreenManager class and 
                #use it to call what you want from there

        ToolButton:
            text: 'Screen two'
            on_press:
                root.ids.SS.current = 'stwo'
                #Use root.ids to find the ID of your ScreenManager class and
                #use it to call what you want from there

    ScreenSwitcher:
        id: SS #Put an ID to your ScreenManager class
        #instead of adding the screens on the __init__method you can also do
        #ScreenOne:
        #ScreenTwo:
...