Kivy ScreenManager出现问题(ScreenManager.current问题)

时间:2019-09-21 17:33:07

标签: python android python-3.x kivy kivy-language

我在使用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'

感谢关注和帮助!

1 个答案:

答案 0 :(得分:0)

  

您的kv代码中的经理实际上是与经理不同的经理   键检查功能中的一个(您实例化了一个新对象   您的经理班)。尝试使用self.manager和self.manager.current =   键检查函数中的“无论如何”,而不是mgr = Manager()。的   屏幕的manager属性应该引用它的ScreenManager。   kivy.org/doc/stable/api-kivy.uix.screenmanager.html

Erik