在数据表 Kivy/KivyMD 中动态添加一行

Posted

技术标签:

【中文标题】在数据表 Kivy/KivyMD 中动态添加一行【英文标题】:Dynamically adding a row in data table Kivy/KivyMD 【发布时间】:2021-10-12 02:01:59 【问题描述】:

例如,我有一个空数据表(只有列数据)和一个按钮。我想在按下按钮时动态添加行数据。有没有可能?

【问题讨论】:

【参考方案1】:

是和不是。正如here 所讨论的,小部件MDDataTable 本身不允许向表中动态添加数据。 尽管如此,人们可以通过使用新数据创建一个新表并显示它来轻松地规避这一点。它可能会变得繁重,但对于较小的表,它工作得很好。

我使用 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中的说明进行操作

【讨论】:

以上是关于在数据表 Kivy/KivyMD 中动态添加一行的主要内容,如果未能解决你的问题,请参考以下文章

第一个 Python/Kivy/KivyMD 应用程序。无法将文本字段中的数据保存到变量 + 数据绑定到 MDList

Kivy/KivyMD 应用程序在 venv 环境中运行良好,但在 exe 文件中崩溃

Kivy/KivyMD - 按钮没有反应

如何通过按下按钮 kivy/kivymd/python 在另一个窗口中创建按钮

用于 MDTextField 的带有 Kivy / KivyMD 的数字键盘

Kivy (KivyMD) 中的按钮和小部件大小