KivyMD:一个独立的登录屏幕和MDBottomNavigation



我想让我的登录屏幕作为应用程序启动时的默认屏幕。用户登录后,屏幕管理器应该切换到主屏幕,这是我的MDBottomNavigation的一部分(登录屏幕不是!(。

基本上,我试图使登录屏幕独立于MDBottomNavigation。。。而我做不到。现在,在开始的时候,我看到了登录屏幕和带有MDBottomNavigation的主屏幕。

在未来,我计划有其他屏幕,在特定情况下应该访问这些屏幕,但不能从MDBottomNavigation访问。我对kivy和kivymd都很陌生,如果有任何帮助,我将不胜感激!

这是我的主要.py:

from kivymd.app import MDApp
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.bottomnavigation import MDBottomNavigationItem
import requests
import json
from kivy.uix.screenmanager import Screen
# the Root
class BL(MDBoxLayout):
pass
# screens
class LoginScreen(Screen):
pass
class HomeScreen(MDBottomNavigationItem):
pass
class OrdersScreen(MDBottomNavigationItem):
pass
class ClientsScreen(MDBottomNavigationItem):
pass
class AccountScreen(MDBottomNavigationItem):
pass

class MainApp(MDApp):
def log_in(self, username, password):
log_in_url = "http://127.0.0.1:8000/api-token-auth/"
log_in_data = {"username": username, "password": password}
log_in_request = requests.post(log_in_url, data=log_in_data)
response_data = json.loads(log_in_request.content.decode())
if log_in_request.ok:
token = response_data["token"]
with open("token.txt", "w") as f:
f.write(token)
user_id = response_data["user_id"]
def change_screen(self, screen_name):
screen_manager = self.root.ids['screen_manager']
screen_manager.current = screen_name
def build(self):
return BL()
MainApp().run()

这是主.kv

#: include kv/loginscreen.kv
#: include kv/homescreen.kv
#: include kv/ordersscreen.kv
#: include kv/clientsscreen.kv
#: include kv/accountscreen.kv
<BL>:
orientation: "vertical"
id: bl
LoginScreen:
name: "login_screen"
id: login_screen
MDBottomNavigation:
id: screen_manager
HomeScreen:
name: "home_screen"
id: home_screen
OrdersScreen:
name: "orders_screen"
id: orders_screen
ClientsScreen:
name: "clients_screen"
id: clients_screen
AccountScreen:
name: "account_screen"
id: account_screen

loginscreen.kv:

<LoginScreen>:
text: "Login"
icon: "login"
MDBoxLayout:
orientation: "vertical"
MDTextField:
id: username
hint_text: "Username"
required: True
helper_text_mode: "on_error"
MDTextField:
id: password
password: True
hint_text: "Password"
required: True
helper_text_mode: "on_error"
MDRaisedButton:
text: "Sign In"
on_release:
app.log_in(username.text, password.text)
app.change_screen("home_screen")

homescreen.kv:

<HomeScreen>:
text: "Home"
icon: "home"
BoxLayout:
orientation: 'vertical'
MDLabel:
text: "SM-COMMERCE APP Main"
halign: "center"

您可以使用ScreenManager制作两个分离的屏幕。一个屏幕用于登录屏幕,另一个屏幕则用于MDBottomNavigation:

<BL>:
orientation: "vertical"
id: bl
ScreenManager:
id: auth_screenmanager
LoginScreen:
name: "login_screen"
id: login_screen

Screen:
name: 'dashboard'
MDBottomNavigation:
id: screen_manager
HomeScreen:
name: "home_screen"
id: home_screen
### add more screens in future

main.py:

class MainApp(MDApp):
def on_start(self):
# check if the user is already logged in then 'dashboard' will show up
# else redirect to 'login_screen'

最新更新