(Kivy Python)在.py文件内按按钮切换屏幕

(Kivy Python)在.py文件内按按钮切换屏幕,python,screen,kivy,kivy-language,Python,Screen,Kivy,Kivy Language,我知道使用on_版本切换.kv文件中的屏幕相对容易。但是,我希望保持在.py文件中创建按钮,因此不希望使用此方法。我做了以下操作来添加一个在按下第14个按钮时发生的功能。在程序中按下按钮时,不会发生任何事情。将屏幕的其他名称尝试到sm.current会抛出错误:“kivy.uix.screenmanager.ScreenManagerException:当按下第14个按钮时,没有名称为“InputScreen”的屏幕。” #奇维格式 kv_文本=“”\ : 着陆屏幕: 输入屏幕: : 名称:'i

我知道使用on_版本切换.kv文件中的屏幕相对容易。但是,我希望保持在.py文件中创建按钮,因此不希望使用此方法。我做了以下操作来添加一个在按下第14个按钮时发生的功能。在程序中按下按钮时,不会发生任何事情。将屏幕的其他名称尝试到sm.current会抛出错误:“kivy.uix.screenmanager.ScreenManagerException:当按下第14个按钮时,没有名称为“InputScreen”的屏幕。”

#奇维格式
kv_文本=“”\
:
着陆屏幕:
输入屏幕:
:
名称:'input_sc'
主持人安排:
编号:1
:
名称:'landing_sc'
网格布局:
id:grid_1
科尔斯:5
身高:480
宽度:800
间距:25,20
填充:25,25
'''
#屏幕管理器
类MyScreenManager(屏幕管理器):
通过
#带按钮布局的主屏幕
类着陆屏幕(屏幕):
定义初始(自我,**kwargs):
超级(着陆屏幕,自我)。\uuuuu初始值(**kwargs)
self.buttons=[]#在此处添加对所有按钮的引用
时钟。计划一次(自我完成初始)
#必须在此处使用ID,因为在小部件初始化之前无法应用ID
定义完成初始化(自身,dt):
self.ids.grid_1.cols=5
#循环在屏幕上制作15个不同的按钮
对于范围(15)内的x:
self.buttons.append(按钮(text='Button{}'。格式(x)))
self.ids.grid_1.add_小部件(self.buttons[x])
self.buttons[x].background_normal='YOUTUBE.png'
def开关屏幕(自身,*参数):
sm.current='input\u sc'
sm=屏幕管理器()
sm.add_小部件(InputScreen(name='input_sc'))
sm.add_小部件(着陆屏幕(name='landing'))
self.buttons[14].bind(在开关屏幕上)
#输入屏幕
类输入屏幕(屏幕):
通过
MySubApp类(应用程序):
def生成(自):
返回MyScreenManager()
def main():
生成器.加载字符串(kv\U文本)
app=MySubApp()
app.run()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
如果有人能帮助我理解我目前逻辑中的漏洞,我将不胜感激。谢谢

每个屏幕都有一个属性,为您提供所使用的
屏幕管理器的实例。您只需使用它来引用
ScreemManager
实例,并使用其
当前方法:

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()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.screenmanager导入screenmanager,屏幕
从kivy.uix.button导入按钮
从kivy.clock导入时钟
#奇维格式
kv_文本=“”\
:
着陆屏幕:
输入屏幕:
:
名称:'input_sc'
主持人安排:
编号:1
按钮:
短信:“你好”
:
名称:'landing_sc'
网格布局:
id:grid_1
科尔斯:5
身高:480
宽度:800
间距:25,20
填充:25,25
'''
#屏幕管理器
类MyScreenManager(屏幕管理器):
通过
#带按钮布局的主屏幕
类着陆屏幕(屏幕):
定义初始(自我,**kwargs):
超级(着陆屏幕,自我)。\uuuuu初始值(**kwargs)
self.buttons=[]#在此处添加对所有按钮的引用
时钟。计划一次(自我完成初始)
#必须在此处使用ID,因为在小部件初始化之前无法应用ID
定义完成初始化(自身,dt):
self.ids.grid_1.cols=5
#循环在屏幕上制作15个不同的按钮
对于范围(15)内的x:
self.buttons.append(按钮(text='Button{}'。格式(x)))
self.ids.grid_1.add_小部件(self.buttons[x])
self.buttons[x].background_normal='YOUTUBE.png'
self.button[14].bind(在释放=self.switch屏幕上)
def开关屏幕(自身,*参数):
self.manager.current='input\u sc'
#输入屏幕
类输入屏幕(屏幕):
通过
MySubApp类(应用程序):
def生成(自):
返回MyScreenManager()
def main():
生成器.加载字符串(kv\U文本)
app=MySubApp()
app.run()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

感谢您提供另一个很好的答案,我现在在文档中看到了这一点。原谅我,因为我对编程一般来说是新手,但在Kivy这样的系统中,学习所有重复性的最佳方法是什么?除了官方文件,还有其他文件吗?或者你是否纯粹通过经验学到了你所知道的?感谢当我开始与Kivy合作时,除了官方文件(这是一个相对较新的框架)之外,几乎没有什么信息。第一个来源始终是官方文档(很适合开始),除此之外,您可以在YouTube、Kivy Google Groups上找到教程、视频教程,当然还有。别担心,学习编码的唯一真正方法就是练习,犯错误,并从中学习。顺便说一句,这是一个永远不会结束的学习过程……:)@奥斯丁
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()