在数据 table Kivy/KivyMD 中动态添加一行
Dynamically adding a row in data table Kivy/KivyMD
例如,我有一个空数据 table(只有列数据)和一个按钮。我想在按下按钮时动态添加行数据。有可能吗?
是也不是。正如 here 所讨论的那样,小部件 MDDataTable
本身不允许将数据动态添加到 table。
尽管如此,可以通过使用新数据创建新的 table 并显示它来轻松规避这一点。它可能会变得繁重,但对于较小的 tables 它工作得很好。
我用 kivy 2.0.0 和 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()
注意:虽然运行这段代码我运行出错了:
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']
这是一个已知的不兼容问题。要解决它,只需按照here
中的说明进行操作
AttributeError: 'MDDataTable' 对象没有属性 'open'
例如,我有一个空数据 table(只有列数据)和一个按钮。我想在按下按钮时动态添加行数据。有可能吗?
是也不是。正如 here 所讨论的那样,小部件 MDDataTable
本身不允许将数据动态添加到 table。
尽管如此,可以通过使用新数据创建新的 table 并显示它来轻松规避这一点。它可能会变得繁重,但对于较小的 tables 它工作得很好。
我用 kivy 2.0.0 和 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()
注意:虽然运行这段代码我运行出错了:
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']
这是一个已知的不兼容问题。要解决它,只需按照here
中的说明进行操作AttributeError: 'MDDataTable' 对象没有属性 'open'