Reputation: 11
I am making an app that will show a datatable inside a tab, and I am trying to show it as the app starts.
Right now I am using a button to show the datatable, but in the finished app I want it to show on start-up or as I open the tab.
.py
from kivymd.app import MDApp
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
from kivy.uix.widget import Widget
from kivymd.uix.datatables import MDDataTable
from kivy.uix.anchorlayout import AnchorLayout
from kivy.metrics import dp
Builder.load_file('testwidgets.kv')
class main(Widget):
pass
class Tab(MDFloatLayout, MDTabsBase):
def load_foodtable(self, *args):
test = range(5)
self.food_layout = AnchorLayout()
self.food_tabel = MDDataTable(
pos_hint={'center_y': 0.5, 'center_x': 0.5},
size_hint=(0.9, 0.6),
column_data=[
("Name", dp(30)),
("Carbohydrates", dp(30)),
("Protin", dp(30)),
],
row_data=[
("stuff", "moreStuff", "2") for i in(test)
],
elevation=20,
)
self.add_widget(self.food_tabel)
return self.food_layout
def on_enter(self):
self.load_foodtable()
class DemoApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Teal"
self.theme_cls.primary_hue = "400"
return main()
if __name__ == '__main__':
DemoApp().run()
.kv
<main>:
MDNavigationLayout:
size : root.width, root.height
ScreenManager:
id: screen_manager
Screen:
name: "mddatatable"
BoxLayout:
orientation: 'vertical'
MDToolbar:
id: toolbar
title: "Drinks and Food"
elevation: 10
MDTabs:
Tab:
title: "Food"
Tab:
title: "Drink"
<Tab>:
MDRaisedButton:
text: 'open table'
on_press: root.on_enter()
pos_hint: {'center_x': .5, 'center_y': .5}
Upvotes: 1
Views: 862
Reputation: 31
I don't know if it's still relevant for you but I came across a similar issue so maybe this solution is of use to anyone...
You need to specify the on_tab_switch
event for the MDTabs
in your .kv
:
on_tab_switch: app.on_tab_switch(*args)
You also need to create this method in the DemoApp
class of your .py
to forward the call to your on_enter
function:
def on_tab_switch(self, instance_tabs, instance_tab, instance_tab_label, tab_text):
instance_tab.on_enter()
Your whole code should look like this:
.py
from kivymd.app import MDApp
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivymd.uix.tab import MDTabsBase
from kivymd.uix.floatlayout import MDFloatLayout
from kivy.uix.widget import Widget
from kivymd.uix.datatables import MDDataTable
from kivy.uix.anchorlayout import AnchorLayout
from kivy.metrics import dp
Builder.load_file('testwidgets.kv')
class main(Widget):
pass
class Tab(MDFloatLayout, MDTabsBase):
def load_foodtable(self, *args):
test = range(5)
self.food_layout = AnchorLayout()
self.food_tabel = MDDataTable(
pos_hint={'center_y': 0.5, 'center_x': 0.5},
size_hint=(0.9, 0.6),
column_data=[
("Name", dp(30)),
("Carbohydrates", dp(30)),
("Protin", dp(30)),
],
row_data=[
("stuff", "moreStuff", "2") for i in(test)
],
elevation=20,
)
self.add_widget(self.food_tabel)
return self.food_layout
def on_enter(self):
self.load_foodtable()
class DemoApp(MDApp):
def build(self):
self.theme_cls.primary_palette = "Teal"
self.theme_cls.primary_hue = "400"
return main()
def on_tab_switch(self, instance_tabs, instance_tab, instance_tab_label, tab_text):
instance_tab.on_enter()
if __name__ == '__main__':
DemoApp().run()
.kv
<main>:
MDNavigationLayout:
size : root.width, root.height
ScreenManager:
id: screen_manager
Screen:
name: "mddatatable"
BoxLayout:
orientation: 'vertical'
MDToolbar:
id: toolbar
title: "Drinks and Food"
elevation: 10
MDTabs:
on_tab_switch: app.on_tab_switch(*args)
Tab:
title: "Food"
Tab:
title: "Drink"
<Tab>:
MDRaisedButton:
text: 'open table'
on_press: root.on_enter()
pos_hint: {'center_x': .5, 'center_y': .5}
Upvotes: 1