【问题标题】:Declaring kivy MDDataTable on the fly returning NoneType动态声明 kivy MDDataTable 返回 NoneType
【发布时间】:2020-09-15 09:39:29
【问题描述】:

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

<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 导入数据表,并尝试通过在我的主 App 类中声明一个实例 table = ObjectProperty(MyDataTable()) 来访问该对象。通过这种声明方法,我应该能够使用self.table.column_data = ['my data', 'my data']self.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 对象并在on_start 类中初始化MyDataTable(),则数据表打开,但为空。

【问题讨论】:

    标签: python python-3.x inheritance kivy kivymd


    【解决方案1】:

    在创建小部件时必须提供这些属性似乎是 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()
    

    【讨论】:

    • 如果您必须在创建小部件时提供属性。这是否意味着当您不使用 MDDatatable 时,即on_leave 屏幕,您应该将其从小部件树中删除,on_enter 每次都使用新数据创建一个新的 MDDatable。我的意思是任何应用程序都不能在内存中保留 MDDatable 的实例并添加新的以及删除列标题和数据行?我应该使用 RecycleView 吗?
    • MDDatable 创建后似乎无法修改。由于它是基于ModalView 的,所以在它已经dismissed() 之后,您不能再次open()RecycleView 更灵活,但它带有更复杂的 api。
    • RecycleView 上的复杂 Api 评论提供帮助。做一些有时看起来很简单的事情真是让人头疼。
    猜你喜欢
    • 2020-12-12
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2017-11-16
    • 2016-05-11
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多