python - 动态声明 kivy MDDataTable 返回 NoneType
问题描述
我正在尝试在我的应用程序中使用 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
并尝试通过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
解决方案
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()
推荐阅读
- php - 验证字符串是否包含年、月、日?
- vim - Vim 文件路径搜索算法
- javascript - 在 html 页面中通过 typescript 打印 html 标签
- html - 视频内的文字
- azure - Azure CLI 脚本变量给出错误
- qt - 如何让 pyqt 应用程序停留在 Rainmeter 等所有窗口的底部?
- csv - 在 CSV 示例 Spark 中定义 ArrayType
- c++ - 不存在从“cv::Mat”到“IplImage”的合适的用户定义转换
- html - 有没有办法在中风中加入渐变?
- swift - 参数类型“xxx”不符合预期类型“_FormatSpecifiable”