简体   繁体   中英

The buttons of MDList gets stuck after changing to Screen contaning MDDataTable --kivy

So here is the problem.. Once i changed to Datasheet screen the buttons of MDList gets struck.. Is their any way to fix this

I can't use any other widget other than MDDATATable and i think it is the main problem.. is this a inbuilt bug or is their something wrong in my code.. please clear

from kivy.metrics import dp
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.properties import ListProperty

from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable

kv  = '''

<Somecls>:
    scrn_manager : scrn_manager
    MDList:
        size_hint : 0.3,1
        pos_hint : {'x':0.0, 'top':1}
        
        TwoLineListItem:
            text : 'First Screen'
            secondary_text : 'Go to home screen'
            on_release:
                scrn_manager.current = 'Home page'
        TwoLineListItem:
            text : 'Data Sheet'
            secondary_text : 'View Data'
            on_release:
                scrn_manager.current = 'Data Table'

    ScreenManager:
        id : scrn_manager
        size_hint : 0.7,1
        pos_hint : {'x':0.3 , 'top':1}
        
        Screen:
            name : 'Home page'
            Label:
                size_hint : 1,1
                text : 'This is just an example'
        
        Screen:
            name : 'Data Table'
            
            
'''
class Somecls(FloatLayout):
    row_data = ListProperty([])
    column_data = ListProperty([])

    def __init__(self,**kwargs):
        super(Somecls, self).__init__(**kwargs)

        self.data_table = MDDataTable(
            pos_hint = {'x':0.01 , 'top':0.96},
            size_hint = (0.8 , 0.96),
            use_pagination = True,
            column_data = [
               ("No.", dp(30)),
               ("Column 1", dp(30)),
               ("Column 2", dp(30)),
               ("Column 3", dp(30)),
               ("Column 4", dp(30)),
               ("Column 5", dp(30)),
            ],
            row_data = [
                (
                    f"{i + 1}",
                    "1",
                    "2",
                    "3",
                    "4",
                    "5",
                )
                for i in range(49)
            ])
        self.scrn_manager.get_screen('Data Table').add_widget(self.data_table)

class Example(MDApp):

    column_data = ListProperty([])
    row_data = ListProperty([])

    def build(self):
        Builder.load_string(kv)
        return Somecls()

Example().run()

Any help is apperciated

That is the way MDDataTable is designed. It is an extension the kivy ModalView , which means that while it is displayed nothing else is operational. I guess the intent is that you must interact with the MDDataTable before continuing.

You do not have to use MDDataTable . Here is a modified version of your code that uses a RecycleGridLayout inside a RecycleView :

from kivy.clock import Clock
from kivy.metrics import dp
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.properties import ListProperty

from kivymd.app import MDApp

kv  = '''
<Somecls>:
    scrn_manager : scrn_manager
    MDList:
        size_hint : 0.3,1
        pos_hint : {'x':0.0, 'top':1}
        
        TwoLineListItem:
            text : 'First Screen'
            secondary_text : 'Go to home screen'
            on_release:
                scrn_manager.current = 'Home page'
        TwoLineListItem:
            text : 'Data Sheet'
            secondary_text : 'View Data'
            on_release:
                scrn_manager.current = 'Data Table'

    ScreenManager:
        id : scrn_manager
        size_hint : 0.7,1
        pos_hint : {'x':0.3 , 'top':1}
        
        Screen:
            name : 'Home page'
            Label:
                size_hint : 1,1
                text : 'This is just an example'
        
        Screen:
            name : 'Data Table'
            RecycleView:
                id: rv
                viewclass: 'MDLabel'
                RecycleGridLayout:
                    row_default_height: 40
                    col_default_width: 200
                    cols: 6
                    size_hint: None, None
                    size: self.minimum_size
'''


class Somecls(FloatLayout):
    row_data = ListProperty([])
    column_data = ListProperty([])

    def __init__(self,**kwargs):
        super(Somecls, self).__init__(**kwargs)
        Clock.schedule_once(self.setup_data_table)

    def setup_data_table(self, dt):
        data = []
        column_data = [
                          ("No.", dp(30)),
                          ("Column 1", dp(30)),
                          ("Column 2", dp(30)),
                          ("Column 3", dp(30)),
                          ("Column 4", dp(30)),
                          ("Column 5", dp(30)),
                      ]
        for col in column_data:
            data.append({'text':col[0], 'size_hint_y':None, 'height':col[1], 'halign':'center'})
        row_data = [
            (
                f"{i + 1}",
                "1",
                "2",
                "3",
                "4",
                "5",
            )
            for i in range(49)
        ]
        for row in row_data:
            for col in row:
                data.append({'text':col, 'halign':'center'})

        self.ids.rv.data = data


class Example(MDApp):

    column_data = ListProperty([])
    row_data = ListProperty([])

    def build(self):
        Builder.load_string(kv)
        return Somecls()

Example().run()

It seems i have found a way. Please suggest if it is a great idea.


from kivy.metrics import dp
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivymd.uix.list import MDList , TwoLineListItem
from kivymd.uix.card import MDCard

from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable

kv = '''

<Somecls>:
    scrn_manager : scrn_manager
    
    ScreenManager:
        id : scrn_manager
        size_hint : 1,1
        pos_hint : {'x':0.0 , 'top':1}

        Screen:
            name : 'Home page'
            
            MDList:
                size_hint : 0.3,1
                pos_hint : {'x':0.0, 'top':1}
        
                TwoLineListItem:
                    text : 'First Screen'
                    secondary_text : 'Go to home screen'
                    on_release:
                        scrn_manager.current = 'Home page'
                TwoLineListItem:
                    text : 'Data Sheet'
                    secondary_text : 'View Data'
                    on_release:
                        scrn_manager.current = 'Data Table'

            MDLabel:
                size_hint : 1,1
                text : 'Home Page'
                halign : 'center'
                

        Screen:
            name : 'Data Table'

'''

class Somecls(FloatLayout):
    row_data = ListProperty([])
    column_data = ListProperty([])

    def __init__(self, **kwargs):
        super(Somecls, self).__init__(**kwargs)

        self.card_ = MDCard(size_hint = (0.3,1) , pos_hint = {'x':0 , 'top':1} ,elevation = 0)
        self.flt = FloatLayout()

        self.data_table = MDDataTable(
            pos_hint={'x': 0.31, 'top': 0.96},
            size_hint=(0.7, 0.96),
            use_pagination=True,
            rows_num = 10,
            column_data=[
                ("No.", dp(30)),
                ("Column 1", dp(30)),
                ("Column 2", dp(30)),
                ("Column 3", dp(30)),
                ("Column 4", dp(30)),
                ("Column 5", dp(30)),
            ],
            row_data=[
                (
                    f"{i + 1}",
                    "1",
                    "2",
                    "3",
                    "4",
                    "5",
                )
                for i in range(49)
            ])

        self.screen_list = MDList(size_hint = (1,1) , pos_hint = {'x':0.0 , 'top':1} )

        self.list_item_1 = TwoLineListItem(text = 'Home Page' , secondary_text = 'Go to home page')
        self.screen_list.add_widget(self.list_item_1)
        self.list_item_1.bind(on_release = self.func1)

        self.list_item_2 = TwoLineListItem(text = 'Data Sheet' , secondary_text = 'Go to datasheet view')
        self.screen_list.add_widget(self.list_item_2)
        self.list_item_2.bind(on_release = self.func2)

        self.scrn_manager.get_screen('Data Table').add_widget(self.data_table)
        self.scrn_manager.get_screen('Data Table').add_widget(self.card_)

        self.flt.add_widget(self.screen_list)

        self.card_.add_widget(self.flt)



    def func1(self,instance):
        self.scrn_manager.current = 'Home page'
    def func2(self,instance):
        self.scrn_manager.current = 'Data Table'

class Example(MDApp):
    column_data = ListProperty([])
    row_data = ListProperty([])

    def build(self):
        Builder.load_string(kv)
        return Somecls()


Example().run()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM