从其他布局更改屏幕

时间:2018-09-26 15:18:55

标签: python kivy

我的意图是在我们的窗口右边有一个布局,在右边有一个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:“超级”对象没有属性“ __getattr__

1 个答案:

答案 0 :(得分:0)

问题-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. 之后
  4. 分别向实例化的name: 'screen1'name: 'screen2'添加Screen1:Screen2:
  5. app.root.ids.scr.switch_to(screen=Screen1)替换为app.root.ids.rbox.ids.scr.current = 'screen1'

ScreenManager: current vs 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"

输出

Img01 Img02