简体   繁体   English

如何从 Kivy 中的 python 代码更改屏幕

[英]How to change screens from python code in Kivy

So I'm working on making a fully functional login screen for my first serious kivy app and I want to be able to change windows/screens when the user presses on a button.所以我正在为我的第一个严肃的 kivy 应用程序制作一个功能齐全的登录屏幕,我希望能够在用户按下按钮时更改窗口/屏幕。 I know normally in the KV file i'd just use on release but I want the on release to call to a method to verify the users credentials, and if those credentials are correct then change screens.我通常知道在 KV 文件中我只会在发布时使用,但我希望发布时调用一种方法来验证用户凭据,如果这些凭据正确,则更改屏幕。 So how in python itself would I be able to call to screen manager to change the screen?那么如何在 python 本身中调用屏幕管理器来更改屏幕?

from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import Screen, ScreenManager




class LoginLayout(Screen):
    def login(self, **kwargs):
        print("Login function working")
        userEmail = self.ids.username.text
        userPassword = self.ids.password.text
        print(userEmail)
        print(userPassword)
        ScreenManager.current('emailWindow')


class EmailWindow(Screen):
    pass

class WindowManager(ScreenManager):
    pass

kv = Builder.load_file('loginScreen.kv')


class LoginScreen(App):

    def build(self):
        return kv


app = LoginScreen()
app.run()

KV千伏

ScreenManager:
    LoginLayout:
    EmailWindow:

<LoginLayout>:
    name: 'loginWindow'

    canvas.before:
        Color:
            rgba: (28/255, 102/255, 137/255, 1)
        Rectangle:
            pos: self.pos
            size: self.size

    BoxLayout:
        orientation: 'vertical'
        size: root.width, root.height

        Label:
            text: 'Username'
            font_name: 'Framd.ttf'
            font_size: 20

        TextInput:
            id: username
            multiline: False
            size_hint: (.5, .3)
            pos_hint: {'center_x' : .5}


        Label:
            text: 'Password'
            font_name: 'Framd.ttf'
            font_size: 20

        TextInput:
            id: password
            multiline: False
            size_hint: (.5, .3)
            pos_hint: {'center_x' : .5}

        Button:
            text: 'Login'
            size_hint: (.2, .8)
            pos_hint: {'center_x' : 0.5}
            font_name: 'Framd.ttf'
            on_release: root.login()

        Button:
            text: 'Create Account'
            size_hint: (.2, .8)
            pos_hint: {'center_x' : 0.5}
            font_name: 'Framd.ttf'


        Button:
            text: 'Forgot login Info'
            size_hint: (.2, .8)
            pos_hint: {'center_x' : 0.5}
            font_name: 'Framd.ttf'

<EmailWindow>:
    name: 'emailWindow'

    canvas.before:
        Color:
            rgba:  (28/255, 102/255, 137/255, 1)
        Rectangle:
            pos: self.pos
            size: self.size

    BoxLayout:
        orientation: 'vertical'
        size: root.width, root.height

        Label:
            text: 'To:'
            font_name: 'Framd.ttf'

        TextInput:
            multiline: False
            pos_hint: {'center_x': 0.5}
            size_hint: (.5, .3)
            font_name: 'Framd.ttf'


        Label:
            text: 'Subject'

        TextInput:
            multiline: False
            pos_hint: {'center_x': 0.5}
            size_hint: (.5, .3)
            font_name: 'Framd.ttf'


        Label:
            text: 'Body'
            font_name: 'Framd.ttf'

        TextInput:
            size_hint: (.5, .7)
            pos_hint: {'center_x': 0.5}
            multiline: True


        Button:
            text: 'send'
            size_hint: (.2, .8)
            pos_hint: {'center_x' : 0.5}
            font_name: 'Framd.ttf'

When a Screen gets added to a ScreenManager , it gets a manager attribute set to the ScreenManager .Screen被添加到ScreenManager时,它会获得一个设置为ScreenManagermanager属性。 So in your login() method you can do:因此,在您的login()方法中,您可以执行以下操作:

self.manager.current = 'emailWindow'

instead of:代替:

ScreenManager.current('emailWindow')

Note that using ScreenManager , as you do above, references the ScreenManager class, not the ScreenManager instance that is in your App.请注意,如上所述,使用ScreenManager会引用ScreenManager class,而不是应用中的ScreenManager实例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM