I’m encountering an issue with my Kivy MD application where the navigation menu is displayed in three columns instead of a single column layout (The menu is multiplied by 3). Here’s an overview of my app:
#app.py
from kivy.uix.screenmanager import ScreenManager
from kivymd.app import MDApp
from login import LoginScreen
from main import MainScreen
from users import UsersScreen
from kivy.lang import Builder
Builder.load_file("login.kv")
Builder.load_file("main.kv")
Builder.load_file("users.kv")
class MainApp(MDApp):
def build(self):
self.sm = ScreenManager()
self.sm.add_widget(LoginScreen(name='login'))
self.sm.add_widget(MainScreen(name='main'))
self.sm.add_widget(UsersScreen(name='users'))
return self.sm
def switch_to_main(self):
self.sm.current = 'main'
def toggle_nav_drawer(self):
if self.sm.current == 'main':
screen = self.sm.get_screen('main')
elif self.sm.current == 'users':
screen = self.sm.get_screen('users')
else:
return
nav_drawer = screen.ids.nav_drawer
nav_drawer.set_state("toggle")
if __name__ == '__main__':
MainApp().run()
#login.py
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
from kivymd.app import MDApp
Builder.load_file("login.kv")
class LoginScreen(Screen):
def verify_credentials(self):
username = self.ids.username.text
password = self.ids.password.text
if username == "admin" and password == "admin":
app = MDApp.get_running_app()
app.switch_to_main()
else:
print("Invalid credentials")
#main.py:
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivymd.uix.navigationdrawer import MDNavigationDrawer
from users import UsersScreen
Builder.load_file("main.kv")
class ContentNavigationDrawer(BoxLayout):
screen_manager = ObjectProperty()
nav_drawer = ObjectProperty()
class MainScreen(Screen):
pass
class MainScreenContent(Screen):
pass
#main.kv:
<ContentNavigationDrawer>:
ScrollView:
MDList:
OneLineListItem:
text: "Home"
on_press:
root.nav_drawer.set_state("close")
root.screen_manager.current = "main"
OneLineListItem:
text: "Users"
on_press:
root.nav_drawer.set_state("close")
root.screen_manager.current = "users"
OneLineListItem:
text: "Settings"
OneLineListItem:
text: "About"
<MainScreen>:
MDNavigationLayout:
ScreenManager:
id: screen_manager
MainScreenContent:
name: "main"
UsersScreen:
name: "users"
MDNavigationDrawer:
id: nav_drawer
ContentNavigationDrawer:
screen_manager: screen_manager
nav_drawer: nav_drawer
<MainScreenContent>:
AnchorLayout:
anchor_x: 'center'
anchor_y: 'top'
MDToolbar:
title: "Main Screen - PPP"
md_bg_color: app.theme_cls.primary_color
left_action_items: [["menu", lambda x: app.get_running_app().toggle_nav_drawer()]]
pos_hint: {"top": 1}
AnchorLayout:
anchor_x: 'center'
anchor_y: 'center'
Label:
text: "Welcome to the Main Screen!"
font_size: 30
bold: True
size_hint_y: None
height: self.texture_size[1]
halign: 'center'
valign: 'middle'
color: "000000" # Setează culoarea textului la negru
<UsersScreen>:
BoxLayout:
orientation: 'vertical'
MDToolbar:
title: "User Page - APP" # Titlul personalizat
md_bg_color: app.theme_cls.primary_color
left_action_items: [["menu", lambda x: app.get_running_app().toggle_nav_drawer()]]
pos_hint: {"top": 1}
AnchorLayout:
anchor_x: 'center'
anchor_y: 'center'
size_hint: 1, 0.9
#users.py:
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen
from kivymd.uix.datatables import MDDataTable
from kivy.uix.anchorlayout import AnchorLayout
from kivy.metrics import dp
Builder.load_file('users.kv')
class UsersScreen(Screen):
def on_pre_enter(self):
layout = AnchorLayout()
data_tables = MDDataTable(
size_hint=(0.9, 0.6),
column_data=[
("Column 1", dp(20)),
("Column 2", dp(30)),
("Column 3", dp(50), self.sort_on_col_3),
("Column 4", dp(30)),
("Column 5", dp(30)),
("Column 6", dp(30)),
("Column 7", dp(30), self.sort_on_col_2),
],
row_data=[
(
"1",
("alert", [255 / 256, 165 / 256, 0, 1], "No Signal"),
"Astrid: NE shared managed",
"Medium",
"Triaged",
"0:33",
"Chase Nguyen",
),
(
"2",
("alert-circle", [1, 0, 0, 1], "Offline"),
"Cosmo: prod shared ares",
"Huge",
"Triaged",
"0:39",
"Brie Furman",
),
(
"3",
(
"checkbox-marked-circle",
[39 / 256, 174 / 256, 96 / 256, 1],
"Online",
),
"Phoenix: prod shared lyra-lists",
"Minor",
"Not Triaged",
"3:12",
"Jeremy lake",
),
(
"4",
(
"checkbox-marked-circle",
[39 / 256, 174 / 256, 96 / 256, 1],
"Online",
),
"Sirius: NW prod shared locations",
"Negligible",
"Triaged",
"13:18",
"Angelica Howards",
),
(
"5",
(
"checkbox-marked-circle",
[enter image description here](https://i.sstatic.net/ZLv9RvPm.png) [39 / 256, 174 / 256, 96 / 256, 1],
"Online",
),
"Sirius: prod independent account",
"Negligible",
"Triaged",
"22:06",
"Diane Okuma",
),
],
)
layout.add_widget(data_tables)
self.add_widget(layout)
def sort_on_col_3(self, data):
return zip(
*sorted(
enumerate(data),
key=lambda l: l[1][3]
)
)
def sort_on_col_2(self, data):
return zip(
*sorted(
enumerate(data),
key=lambda l: l[1][-1]
)
)
What could be causing the navigation drawer to display menu items in multiple columns instead of a single column layout when I consolidate the MainApp class in app.py? How can I ensure it displays correctly?
Any help or insights would be greatly appreciated! Thank you