(Kivy Python)按钮上的切换屏幕按内部.py文件

时间:2017-07-01 03:53:02

标签: python screen kivy kivy-language

据我所知,使用on_release在.kv文件中切换屏幕相对容易。我想在.py文件中保留我的按钮,所以我不想使用这种方法。我已完成以下操作以添加按下第14个按钮时发生的功能。在程序中按下按钮时没有任何反应。尝试屏幕的其他名称为sm.current以引发错误:“kivy.uix.screenmanager.ScreenManagerException:按下第14个按钮时没有名称为”InputScreen“的屏幕。”

# Kivy Formatting
kv_text='''\

<MyScreenManager>:
    LandingScreen:
    InputScreen:

<InputScreen@Screen>:
    name: 'input_sc'
    AnchorLayout:
        id: anchor_1

<LandingScreen@Screen>:
    name: 'landing_sc'
    GridLayout:
        id: grid_1
        cols: 5
        height: 480
        width: 800
        spacing: 25, 20
        padding: 25,25

'''
# Screen Manager
class MyScreenManager(ScreenManager):
    pass

# Main screen with button layout
class LandingScreen(Screen):
    def __init__(self, **kwargs):
        super(LandingScreen, self).__init__(**kwargs)
        self.buttons = [] # add references to all buttons here
        Clock.schedule_once(self._finish_init)

    # IDs have to be used here because they cannot be applied until widget initialized
    def _finish_init(self, dt):
        self.ids.grid_1.cols = 5

        # Loop to make 15 different buttons on screen
        for x in range(15):
            self.buttons.append(Button(text='button {}'.format(x)))
            self.ids.grid_1.add_widget(self.buttons[x])
            self.buttons[x].background_normal = 'YOUTUBE.png'

        def SwitchScreen(self,*args):
            sm.current = 'input_sc'

        sm = ScreenManager()
        sm.add_widget(InputScreen(name='input_sc'))
        sm.add_widget(LandingScreen(name='landing'))
        self.buttons[14].bind(on_release=SwitchScreen)


# Input screen
class InputScreen(Screen):
    pass

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

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

if __name__ == '__main__':
    main()

如果有人能帮我理解当前逻辑中的漏洞,我会非常感激。谢谢。

1 个答案:

答案 0 :(得分:1)

每个屏幕都有一个manager属性,可以为您提供所使用的ScreenManager的实例。您只需要使用它来引用ScreemManager实例并使用其current方法:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.clock import Clock


# Kivy Formatting
kv_text='''\

<MyScreenManager>:
    LandingScreen:
    InputScreen:

<InputScreen@Screen>:
    name: 'input_sc'
    AnchorLayout:
        id: anchor_1
        Button:
            text: 'Hello'

<LandingScreen@Screen>:
    name: 'landing_sc'
    GridLayout:
        id: grid_1
        cols: 5
        height: 480
        width: 800
        spacing: 25, 20
        padding: 25,25

'''
# Screen Manager
class MyScreenManager(ScreenManager):
    pass

# Main screen with button layout
class LandingScreen(Screen):
    def __init__(self, **kwargs):
        super(LandingScreen, self).__init__(**kwargs)
        self.buttons = [] # add references to all buttons here
        Clock.schedule_once(self._finish_init)

    # IDs have to be used here because they cannot be applied until widget initialized
    def _finish_init(self, dt):
        self.ids.grid_1.cols = 5

        # Loop to make 15 different buttons on screen
        for x in range(15):
            self.buttons.append(Button(text='button {}'.format(x)))
            self.ids.grid_1.add_widget(self.buttons[x])
            self.buttons[x].background_normal = 'YOUTUBE.png'

        self.buttons[14].bind(on_release=self.switch_screen)

    def switch_screen(self, *args):
        self.manager.current = 'input_sc'

# Input screen
class InputScreen(Screen):
    pass

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

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

if __name__ == '__main__':
    main()