dro*_*top 4 kivy material-design kivymd
MDDataTable我在将 kivymd组件作为子小部件添加到 .kv 文件中的屏幕时遇到一些问题。不断收到KeyError: 'container'错误AttributeError: 'super' object has no attribute '__getattr__。我浏览了文档和多个站点,每个人似乎都在使用文档中找到的示例的某种变体,它在构建方法中启动组件。
我想说的是如果这有效的话
class Example(MDApp):
def build(self):
screen = Screen()
data_tables = MDDataTable(
size_hint=(0.9, 0.6),
column_data=[
('Template Id', dp(30)),
('Name', dp(30))
],
row_data=[
('23lkjk33', 'Ayang Paul'),
('28ij399kk', 'Ringwa Justin')
]
)
screen.add_widget(data_tables)
return screen
Example().run()
Run Code Online (Sandbox Code Playgroud)
那为什么这不起作用
KV = '''
Screen:
MDDataTable:
size_hint: 0.9, 0.6
pos_hint: {"center_x": 0.5, "center_y": 0.5}
column_data: [('Template Id', dp(30)), ('Name', dp(30))]
row_data: [('23lkjk33', 'Ayang Paul'), ('28ij399kk', 'Ringwa Justin')]
'''
class Example(MDApp):
def build(self):
return Builder.load_string(KV)
Example().run()
Run Code Online (Sandbox Code Playgroud)
???
问题是该MDDataTable__init__()方法引用了ids,但在kv文件中使用时,ids尚不可用。是MDDataTable的子类ModalView,因此它显然旨在像 a 一样使用,Popup而不是在kv文件中使用。
这是一个让它在kv文件中工作的技巧:
from kivymd.uix.datatables import MDDataTable, TableHeader, TableData, TablePagination
from kivymd.uix.dialog import BaseDialog
class MyDataTable(MDDataTable):
def __init__(self, **kwargs):
# skip the MDDataTable.__init__() and call its superclass __init__()
super(BaseDialog, self).__init__(**kwargs)
# schedule call to MDDataTable.__init__() contents after ids are populated
Clock.schedule_once(partial(self.delayed_init, **kwargs))
def delayed_init(self, dt, **kwargs):
# this is copied from MDDataTable.__init__() with super() call deleted
self.register_event_type("on_row_press")
self.register_event_type("on_check_press")
self.header = TableHeader(column_data=self.column_data, sort=self.sort)
self.table_data = TableData(
self.header,
row_data=self.row_data,
check=self.check,
rows_num=self.rows_num,
_parent=self,
)
self.pagination = TablePagination(table_data=self.table_data)
self.table_data.pagination = self.pagination
self.header.table_data = self.table_data
self.table_data.fbind("scroll_x", self._scroll_with_header)
self.ids.container.add_widget(self.header)
self.ids.container.add_widget(self.table_data)
if self.use_pagination:
self.ids.container.add_widget(self.pagination)
Clock.schedule_once(self.create_pagination_menu, 0.5)
Run Code Online (Sandbox Code Playgroud)
因此,请使用MyDataTableyourkv代替MDDataTable. 上面的代码延迟了方法核心的执行,MDDataTable.__init__()直到ids可用为止。如果MDDataTable代码被更新,这个 hack 可能不起作用。
| 归档时间: |
|
| 查看次数: |
4081 次 |
| 最近记录: |