Lepp
Lepp

Reputation: 11

How can I show KivyMD datatable on start-up?

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

Answers (1)

OneShotDev
OneShotDev

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

Related Questions