'Dynamically adding a row in data table Kivy/KivyMD
For example I have an empty data table (with only column data) and a button. I want to dynamically add row data when button is pressed. Is it even possible?
Solution 1:[1]
Yes and no. The widget MDDataTable
doesn't permit natively the addition of data dynamically to the table, as is discussed here.
Nonetheless, one can easily circumvent that by creating a new the table with the new data and show it. It can become process heavy, but for smaller tables it works just fine.
I made an example using kivy 2.0.0 and kivymd 0.104.1:
from kivy.metrics import dp
from kivy.uix.button import Button
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable
class Example(MDApp):
def build(self):
self.i = 0
self.rowData = ["Row. No."]
self.button = Button(text="AddRow", size_hint_y=None, pos_hint={"bottom": 0})
self.button.bind(texture_size=self.button.setter('size'))
self.data_tables = None
self.set_table(self.rowData)
def set_table(self, data):
if self.data_tables:
self.data_tables.ids.container.remove_widget(self.button)
self.data_tables = MDDataTable(size_hint=(0.9, 0.6), use_pagination=True, check=True,
column_data=[("No.", dp(30))], row_data=[self.rowData])
self.data_tables.ids.container.add_widget(self.button)
def on_start(self):
self.data_tables.open()
self.button.bind(on_press=lambda x: self.addrow())
def addrow(self):
self.data_tables.dismiss(animation=False)
self.i += 1
self.set_table(self.rowData.append("Row {}".format(self.i)))
self.data_tables.open(animation=False)
if __name__ == '__main__':
Example().run()
Note: While running this code i ran into an error:
ValueError: TableRecycleGridLayout.orientation is set to an invalid option 'vertical'. Must be one of: ['lr-tb', 'tb-lr', 'rl-tb', 'tb-rl', 'lr-bt', 'bt-lr', 'rl-bt', 'bt-rl']
It's a known issue of incompatibility. To solve it, all there is needed is to follow the instructions in this here
Solution 2:[2]
AttributeError: 'MDDataTable' object has no attribute 'open'
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Felipe Bavaroski Costa |
Solution 2 | Grimy Can |