【发布时间】:2019-09-21 17:33:07
【问题描述】:
我对 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'
感谢关注和帮助!
【问题讨论】:
-
kv 代码中的
Manager实际上是与keycheck函数中的不同的管理器(您已经实例化了Manager类的新对象)。尝试在您的keycheck函数中使用self.manager和self.manager.current = "whatever"而不是mgr = Manager()。Screen的manager属性应该引用它的ScreenManager。 kivy.org/doc/stable/api-kivy.uix.screenmanager.html -
非常感谢!它实际上工作正常!
标签: python android python-3.x kivy kivy-language