动态声明 kivy MDDataTable 返回 NoneType
Declaring kivy MDDataTable on the fly returning NoneType
我正尝试在我的应用程序中使用 MDDataTable,就像我使用我的 ModalViews 一样。那就是我在单独的 indexui
kivy 文件中声明布局,例如
<MyDataTable>
id: table1
size_hint: [0.94, 0.8]
use_pagination: True
在我单独的 indexui
python 文件中,我声明了一个从 MDDataTable
继承的空 class
class MyDataTable(MDDataTable):
pass
在我的 main.py 文件中,我使用 from views.indexui import MyDataTable
导入数据表,并尝试通过在我的主文件 App
[=47= 中声明一个实例 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
class 中初始化 MyDataTable()
数据表打开,但为空。
创建小部件时必须提供这些属性似乎是 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,就像我使用我的 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
[=47= 中声明一个实例 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
class 中初始化 MyDataTable()
数据表打开,但为空。
创建小部件时必须提供这些属性似乎是 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()