首页 > 解决方案 > Kivy ScreenManager 的问题(ScreenManager.current 问题)

问题描述

我对 ScreenManager 有疑问,它在密码检查后不会更改屏幕。当密码被检查并且一切正常时——需要切换到main_menu屏幕。现在它只在下次启动程序后才能工作,因为当你输入正确的密码时——你只会看到密码是正确的,仅此而已!

有我的 main.py:

from kivy.app import App
from kivymd.theming import ThemeManager
from kivymd.label import MDLabel
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout
from kivy.metrics import dp, sp, pt
from kivy.properties import ObjectProperty, NumericProperty, StringProperty, BooleanProperty, ListProperty
from kivymd.toast.kivytoast import toast
from kivymd.textfields import MDTextField
from kivy.storage.jsonstore import JsonStore
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import SlideTransition
from kivy.uix.screenmanager import NoTransition

class keyinput(MDTextField):
    pass

class Manager(ScreenManager):
    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)

        psw = JsonStore('password.json')

        if psw.exists('key'):
            registeredkey = psw.get('key')['keyvalue']
            if registeredkey != '12345678':
                self.transition = NoTransition()
                self.current = 'login_screen'
            else:
                self.transition = NoTransition()
                self.current = 'main_menu'
        else:
            toast('THERE IS NO KEY IN YOUR SYSTEM!')
            self.transition = NoTransition()
            self.current = 'login_screen'

class LoginScreen(Screen):

    def keycheck(self):

        psw = JsonStore('password.json')

        if self.kinput.text == '12345678':
            toast('KEY IS CORRECT')
            mngr = Manager()
            mngr.transition = NoTransition()
            mngr.current = 'main_menu'
            psw.put('key', keyvalue=str(self.kinput.text))
        elif len(self.kinput.text) > 8:
            toast('Too much text!')
        else:
            toast('KEY IS INCORRECT!')

class MainMenu(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        kinput = ObjectProperty(None)

        self.menu_items = [
                {
                    "viewclass": "MDMenuItem",
                    "text": "text%d" % i,
                    "callback": self.callback,
                }
                for i in range(1, 3)
            ]

        self.menu_button = None

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

    def callback(self, *args):
        toast(args[0])

class MainApp(App):
    title = "KivyMD MDDropdownMenu Demo"
    theme_cls = ThemeManager()

    def build(self):
        return Manager()

if __name__ == "__main__":
    MainApp().run()

有我的main.kv:

#:import MDDropdownMenu kivymd.menus.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton
#:import MDLabel kivymd.label.MDLabel

<OptionalLabel@MDLabel>:
    halign: 'center'
    font_size: dp(12)

<MDRB@MDRaisedButton>:
    size_hint: None, None
    size: 3 * dp(48), dp(48)
    pos_hint: {'center_x': 0.5, 'center_y': 0.5}
    opposite_colors: True

<keyinput>:
    size_hint_x: 0.5
    halign: 'center'
    pos_hint: {'center_x': .5, 'center_y': .5}
    max_text_length: 8

<Manager>:
    LoginScreen:
        id: login_screen
        name: 'login_screen'
    MainMenu:
        id: main_menu
        name: 'main_menu'

<LoginScreen>:
    kinput: kinput
    AnchorLayout:
        anchor_y: 'center'
        BoxLayout:
            orientation: 'vertical'
            size_hint: 0.5, 0.5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}
            spacing: dp(10)
            MDRB:
                text: 'Login'
                on_release:
                    root.keycheck()
            keyinput:
                id: kinput
                hint_text: "Login password"

<MainMenu>:
    AnchorLayout:
        anchor_y: 'center'
        BoxLayout:
            orientation: 'vertical'
            size_hint: 0.5, 0.5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}
            spacing: dp(10)
            OptionalLabel:
                text: 'You have logged in'

感谢关注和帮助!

标签: pythonandroidpython-3.xkivykivy-language

解决方案


kv 代码中的 Manager 实际上是与 keycheck 函数中的不同的 manager(您已经实例化了 Manager 类的新对象)。尝试在您的 keycheck 函数中使用 self.manager 和 self.manager.current = "whatever" 而不是 mgr = Manager()。Screen 的 manager 属性应该引用它的 ScreenManager。kivy.org/doc/stable/api-kivy.uix.screenmanager.html

埃里克


推荐阅读