Проблемы с Kivy ScreenManager (проблема ScreenManager.current) - PullRequest
0 голосов
/ 21 сентября 2019

У меня проблема с 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 голосов
/ 22 сентября 2019

Менеджер в вашем коде kv на самом деле отличается от менеджера в функции проверки ключей (вы создали новый объект вашего класса Manager).Попробуйте использовать self.manager и self.manager.current = "what" в вашей функции проверки ключей вместо mgr = Manager ().Атрибут менеджера экрана должен ссылаться на его ScreenManager.kivy.org/doc/stable/api-kivy.uix.screenmanager.html

Эрик

...