首页 > 解决方案 > 动态声明 kivy MDDataTable 返回 NoneType

问题描述

我正在尝试在我的应用程序中使用 MDDataTable,就像我使用我的 ModalViews 一样。那就是我在单独的indexuikivy 文件中声明布局,例如

<MyDataTable>
    id: table1
    size_hint: [0.94, 0.8]
    use_pagination: True    

在我单独indexui的 python 文件中,我声明了一个继承自 MDDataTable 的空类

class MyDataTable(MDDataTable):
    pass

在我的 main.py 文件中,我使用导入数据表from views.indexui import MyDataTable并尝试通过table = ObjectProperty(MyDataTable())在我的主App类中声明一个实例来访问该对象。使用这种声明方法,我应该能够使用self.table.column_data = ['my data', 'my data']andself.table.row_data = [('row1', dp(30)), ('row2', dp(30))]

我在运行应用程序时收到以下错误: AttributeError: 'NoneType' object has no attribute 'property'

如果我删除声明 ObjectProperty(MyDataTable()) 的部分,我会收到以下错误: TypeError: argument of type 'module' is not iterable

有人可以给我一个错误原因的线索吗?

这是最小的示例。当然,我使用该实例的方式是Screens根据用户是否需要创建三个不同的数据表on_entry并将其删除on_leave。为了使示例最小化,我还将所有内容都放在一个文件中。

from kivy.metrics import dp

from kivymd.app import MDApp
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivymd.uix.datatables import MDDataTable

Builder.load_string('''
<MyDataTable>
    id: table1
    size_hint: [0.94, 0.8]
    use_pagination: True
<MyNewAppy>:
''')
class MyDataTable(MDDataTable):
    pass
class MyNewAppy(FloatLayout):
    pass

class Example(MDApp):
    table = ObjectProperty(MyDataTable())
    def build(self):
        return MyNewAppy()
    def on_start(self):
        self.table.column_data = [
                ("Column 1", dp(30)),
                ("Column 2", dp(30)),
                ("Column 3", dp(30)),
                ("Column 4", dp(30)),
                ("Column 5", dp(30)),
                ("Column 6", dp(30)),
            ]
        self.table.row_data = [
                ("1", "2", "3", "4", "5", "6"),
                ("1", "2", "3", "4", "5", "6"),
            ]
        self.table.open()
Example().run()

编辑:如果我将table变量声明为对象并在类中None初始化数据表打开,但为空。MyDataTable()on_start

标签: pythonpython-3.xinheritancekivykivymd

解决方案


KivyMD 小部件的常见(但未记录)缺点似乎是在创建小部件时必须提供这些属性。所以,我相信你的代码应该是这样的:

class Example(MDApp):
    table = ObjectProperty(None)

    def build(self):
        return MyNewAppy()

    def on_start(self):
        self.table = MyDataTable(
            column_data=[
                ("Column 1", dp(30)),
                ("Column 2", dp(30)),
                ("Column 3", dp(30)),
                ("Column 4", dp(30)),
                ("Column 5", dp(30)),
                ("Column 6", dp(30)),
            ],
            row_data=[
                ("1", "2", "3", "4", "5", "6"),
                ("1", "2", "3", "4", "5", "6"),
            ]
        )
        self.table.open()

推荐阅读