按kivy按钮转到多个屏幕之一

时间:2017-08-17 05:15:18

标签: python screen kivy

假设我有一个kivy程序,其中第一个屏幕有三个按钮,每个按钮将您带到另一个屏幕。每个屏幕都包含一个按钮,可以将您带到最终屏幕(同一屏幕)。最终屏幕有一个“后退”按钮。如何在最终屏幕上设置“后退”按钮,将您带回到上一个屏幕(上面提到的3个中的1个)?下面是一个粗略的图表,以更好地帮助可视化我的问题。

                  Screen 1
Start Screen -->  Screen 2 --> Final Screen
                  Screen 3 

截至目前,最终屏幕上的“后退”按钮会将您带回“开始”屏幕,但这不是我想要的。

我的python代码:

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

class MyScreenManager(ScreenManager):
    pass

# Branch Screen, takes you to S1, S2, or S3
class BRANCH(Screen):
    pass

class S1(Screen):
    pass

class S2(Screen):
    pass

class S3(Screen):
    pass

class FINAL_SCREEN(Screen):
    pass

class MAINApp(App):
    def build(self):
        return MyScreenManager()

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

我的kivy语言代码:

#:kivy 1.0.9

<MyScreenManager>:
    BRANCH:
    name: 'branch'
    S1:
    name: 'screen1'
    S2:
    name: 'screen2'
    S3:
    name: 'screen3'
    FINAL_SCREEN:
    name: 'final_screen'


<BRANCH>
    FloatLayout:
    Button:
        text: 'Screen-1'
        color: 1.0, 0.6, 0.0, 1
        font_size: 30
        size_hint_x: 0.50
        size_hint_y: 0.25
        pos_hint: {'x': 0.20, 'y': 0.75}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'screen1'
    Button:
        text: 'Screen-2'
        color: 1.0, 0.6, 0.0, 1
        font_size: 30
        size_hint_x: 0.50
        size_hint_y: 0.25
        pos_hint: {'x': 0.20, 'y': 0.40}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'screen2'
    Button:
        text: 'Screen-3'
        color: 1.0, 0.6, 0.0, 1
        font_size: 30
        size_hint_x: 0.50
        size_hint_y: 0.25
        pos_hint: {'x': 0.20, 'y': 0.05}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'screen3'
<S1>
    FloatLayout:
    Label:
        pos_hint: {'x': 0.00, 'y': 0.20}
        font_size: 35
        text: 'this is SCREEN-1'
        color: 1, 1, 1, 1
    Button:
        text: 'Forward'
        color: 1.0, 0.6, 0.0, 1
        font_size: 20
        size_hint_x: 0.20
        size_hint_y: 0.20
        pos_hint: {'x': 0.40, 'y': 0.15}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'final_screen'
<S2>
    FloatLayout:
    Label:
        pos_hint: {'x': 0.00, 'y': 0.20}
        font_size: 35
        text: 'me este SCREEN-2'
        color: 1, 1, 1, 1
    Button:
        text: 'Onward'
        color: 1.0, 0.6, 0.0, 1
        font_size: 20
        size_hint_x: 0.20
        size_hint_y: 0.20
        pos_hint: {'x': 0.40, 'y': 0.15}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'final_screen'
<S3>
    FloatLayout:
    Label:
        pos_hint: {'x': 0.00, 'y': 0.20}
        font_size: 35
        text: 'something SCREEN-3'
        color: 1, 1, 1, 1
    Button:
        text: 'Lets Go'
        color: 1.0, 0.6, 0.0, 1
        font_size: 20
        size_hint_x: 0.20
        size_hint_y: 0.20
        pos_hint: {'x': 0.40, 'y': 0.15}
        on_release:
            root.manager.transition.direction = 'left'
            root.manager.current = 'final_screen'
<FINAL_SCREEN>
    FloatLayout:
    Label:
        pos_hint: {'x': 0.00, 'y': 0.20}
        font_size: 35
        text: 'Final Screen'
        color: 1, 1, 1, 1
    Button:
        text: 'Back'
        color: 1.0, 0.6, 0.0, 1
        font_size: 20
        size_hint_x: 0.20
        size_hint_y: 0.20
        pos_hint: {'x': 0.40, 'y': 0.15}
        on_release:
            root.manager.transition.direction = 'right'
            root.manager.current = 'branch'

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:2)

以下是使用src/main/resources屏幕上的StringProperty的一种解决方案。

我在进入最终屏幕时设置它

Final

回去时我正用它来进入这个界面

root.manager.ids.final.previous = root.name

这是你的整个应用

root.manager.current = root.previous

我按照评论中的建议尝试from kivy.app import App from kivy.uix.screenmanager import Screen, ScreenManager from kivy.lang import Builder from kivy.properties import StringProperty kv_str = """ MyScreenManager: BRANCH: name: 'branch' S1: name: 'screen1' S2: name: 'screen2' S3: name: 'screen3' FINAL_SCREEN: id: final name: 'final_screen' <BRANCH> FloatLayout: Button: text: 'Screen-1' color: 1.0, 0.6, 0.0, 1 font_size: 30 size_hint_x: 0.50 size_hint_y: 0.25 pos_hint: {'x': 0.20, 'y': 0.75} on_release: root.manager.transition.direction = 'left' root.manager.current = 'screen1' Button: text: 'Screen-2' color: 1.0, 0.6, 0.0, 1 font_size: 30 size_hint_x: 0.50 size_hint_y: 0.25 pos_hint: {'x': 0.20, 'y': 0.40} on_release: root.manager.transition.direction = 'left' root.manager.current = 'screen2' Button: text: 'Screen-3' color: 1.0, 0.6, 0.0, 1 font_size: 30 size_hint_x: 0.50 size_hint_y: 0.25 pos_hint: {'x': 0.20, 'y': 0.05} on_release: root.manager.transition.direction = 'left' root.manager.current = 'screen3' <S1>: FloatLayout: Label: pos_hint: {'x': 0.00, 'y': 0.20} font_size: 35 text: 'this is SCREEN-1' color: 1, 1, 1, 1 Button: text: 'Forward' color: 1.0, 0.6, 0.0, 1 font_size: 20 size_hint_x: 0.20 size_hint_y: 0.20 pos_hint: {'x': 0.40, 'y': 0.15} on_release: root.manager.transition.direction = 'left' root.manager.current = 'final_screen' root.manager.ids.final.previous = root.name <S2>: FloatLayout: Label: pos_hint: {'x': 0.00, 'y': 0.20} font_size: 35 text: 'me este SCREEN-2' color: 1, 1, 1, 1 Button: text: 'Onward' color: 1.0, 0.6, 0.0, 1 font_size: 20 size_hint_x: 0.20 size_hint_y: 0.20 pos_hint: {'x': 0.40, 'y': 0.15} on_release: root.manager.transition.direction = 'left' root.manager.current = 'final_screen' root.manager.ids.final.previous = root.name <S3>: FloatLayout: Label: pos_hint: {'x': 0.00, 'y': 0.20} font_size: 35 text: 'something SCREEN-3' color: 1, 1, 1, 1 Button: text: 'Lets Go' color: 1.0, 0.6, 0.0, 1 font_size: 20 size_hint_x: 0.20 size_hint_y: 0.20 pos_hint: {'x': 0.40, 'y': 0.15} on_release: root.manager.transition.direction = 'left' root.manager.current = 'final_screen' root.manager.ids.final.previous = root.name <FINAL_SCREEN>: FloatLayout: Label: pos_hint: {'x': 0.00, 'y': 0.20} font_size: 35 text: 'Final Screen' color: 1, 1, 1, 1 Button: text: 'Back' color: 1.0, 0.6, 0.0, 1 font_size: 20 size_hint_x: 0.20 size_hint_y: 0.20 pos_hint: {'x': 0.40, 'y': 0.15} on_release: root.manager.transition.direction = 'right' root.manager.current = root.previous """ class MyScreenManager(ScreenManager): pass # Branch Screen, takes you to S1, S2, or S3 class BRANCH(Screen): pass class S1(Screen): pass class S2(Screen): pass class S3(Screen): pass class FINAL_SCREEN(Screen): previous = StringProperty() class MAINApp(App): def build(self): return Builder.load_string(kv_str) if __name__ == '__main__': MAINApp().run()

previous()

奇怪的是,它总会返回screen3,因此我使用了上面的版本。