Kivy ScreenManager的问题(屏幕管理器.current麻烦)

2024-03-29 13:01:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有问题的屏幕管理器,它不会改变屏幕后,密码检查。 当密码已被检查和它的权利-有需要切换到主菜单屏幕。现在它只在程序下一次启动后工作,因为当你输入正确的密码时,你只会看到密码是正确的,仅此而已!你知道吗

这是我的主.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()

这是我的主电源.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'

感谢您的关注和帮助!你知道吗


Tags: textfromimportselfsizedefmenudp
1条回答
网友
1楼 · 发布于 2024-03-29 13:01:33

The Manager in your kv code is actually a different manager than the one in your keycheck function (you have instantiated a new object of your Manager class). Try using self.manager and self.manager.current = "whatever" in your keycheck function instead of mgr = Manager(). The manager attribute of a Screen should refer to it's ScreenManager. kivy.org/doc/stable/api-kivy.uix.screenmanager.html

Erik

相关问题 更多 >