Изменение экрана из другого макета - PullRequest
0 голосов
/ 26 сентября 2018

Мое намерение - иметь макет справа от нашего окна и ScreenManager справа.Оба находятся в разных макетах, но в одном и том же основном приложении.Мне кажется, что я не могу иметь кнопку на экране изменения макета в диспетчере экрана.

Это мой код kv:

<MainWindow>:
    rows: 1
    columns: 2

    LeftBox:

    RightBox:

<LeftBox>:
    Button:
        text: "Screen 1"
        on_press:
            app.root.ids.scr.switch_to(screen=Screen1)

    Button:
        text: "Screen 2"

<RightBox>:
    ScrMng:

<ScrMng>:
    id: scr

    Screen1:
        Button:
            text: "Hello"

    Screen2:
        Button:
            text: "World"

И это мой код Python:

import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.widget import Widget
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty

class MainWindow(GridLayout):
    pass

class ScrMng(ScreenManager):
    pass

class LeftBox(BoxLayout):
    pass

class RightBox(BoxLayout):
    pass

class Screen1(Screen):
    pass

class Screen2(Screen):
    pass


class newtestApp(App):
    def build(self):
        return MainWindow()

k = newtestApp()
k.run()

Я получаю ошибку

AttributeError: у объекта 'super' нет атрибута '__getattr__'

1 Ответ

0 голосов
/ 26 сентября 2018

Проблема - KeyError

До AttributeError: 'super' object has no attribute '__getattr__' существует KeyError: 'scr'

app.root.ids.scr.switch_to(screen=Screen1)

Решение

  1. Добавить id: rbox для экземпляра RightBox: виджет в правиле класса, <MainWindow>:, чтобы мы могли получить доступ к id: scr, используя ids.rbox.ids.scr
  2. Перемещение id: scr из правила класса, <ScrMng>: к после создания экземпляра ScrMng: в правиле класса, <RightBox>:
  3. Добавьте name: 'screen1' и name: 'screen2' к экземплярам Screen1: и Screen2: соответственно.
  4. Замените app.root.ids.scr.switch_to(screen=Screen1) на app.root.ids.rbox.ids.scr.current = 'screen1'

ScreenManager: текущий против switch_to

Обратите внимание , что этот метод добавляет экран к экземпляру ScreenManager и не должен использоваться, если ваши экраныуже были добавлены к этому экземпляру.Чтобы переключиться на экран, который уже добавлен, вы должны использовать свойство current .

ScreenManager »switch_to

switch_to(screen, **options)

Добавьте новый экран в ScreenManager и переключитесь на него.Предыдущий экран будет удален от детей.параметры - это параметры перехода, которые будут изменены до начала анимации.

файл kv

#:kivy 1.11.0

<MainWindow>:
    rows: 1
    columns: 2

    LeftBox:

    RightBox:
        id: rbox

<LeftBox>:
    Button:
        text: "Screen 1"
        on_press:
            app.root.ids.rbox.ids.scr.current = 'screen1'

    Button:
        text: "Screen 2"
        on_press:
            app.root.ids.rbox.ids.scr.current = 'screen2'

<RightBox>:
    ScrMng:
        id: scr

<ScrMng>:

    Screen1:
        name: 'screen1'
        Button:
            text: "Hello"

    Screen2:
        name: 'screen2'
        Button:
            text: "World"

Вывод

Img01Img02

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...