如何在另一个屏幕上制作 MDDataTable?
Posted
技术标签:
【中文标题】如何在另一个屏幕上制作 MDDataTable?【英文标题】:How can I make an MDDataTable in another screen? 【发布时间】:2021-04-15 12:18:33 【问题描述】:按下按钮后,我找不到将 MDDataTable 放入第二个屏幕的方法。当我从第一个屏幕按下按钮时,我希望能够在第二个屏幕中显示我的表格。我不知道要写什么才能让 view_account 函数在我的帐户屏幕中运行。桌子似乎无法进入第二个屏幕。 我得到的错误是这样的
self.table.open()
AttributeError: 'DemoApp' object has no attribute 'table'
Window.size = (300, 500)
screen_helper = """
ScreenManager:
MenuScreen:
AccountScreen:
<MenuScreen>:
name: 'menu'
MDLabel:
text: "Login Page Test"
pos_hint: 'center_x':0.8, 'center_y':0.9
MDRectangleFlatButton:
text: 'Proceed To Next Page'
pos_hint: 'center_x':0.5, 'center_y':0.4
font_size : 20
on_press:
root.manager.current = 'account'
app.view_account()
<AccountScreen>:
name: 'account'
MDLabel:
text: 'Accounts Page Test'
halign: 'center'
"""
class MenuScreen(Screen):
pass
class AccountScreen(Screen):
pass
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(AccountScreen(name='account'))
class DemoApp(MDApp):
def build(self):
screen = Builder.load_string(screen_helper)
return screen
def view_account(self):
rows = []
table = MDDataTable(pos_hint='center_x': .5, 'center_y': .6,
size_hint=(.9, 0.7),
check=True,
rows_num=30,
column_data=[
("Type.", dp(38)),
("Balance", dp(20)),
("Date", dp(20)),
("id", dp(20))
],
row_data=rows
)
table.bind(on_check_press=self.check_press)
table.bind(on_row_press=self.row_press)
close_button1 = MDFlatButton(text='Close', on_release=self.close_view)
self.table.open()
def row_press(self, instance_table, instance_row):
print(instance_table, instance_row)
DemoApp().run()
【问题讨论】:
【参考方案1】:不要在应用程序中执行此操作,而是在具有按钮的屏幕中创建一个功能,然后访问另一个屏幕,然后添加到它。
Kivy修改(添加方法并为表格创建一个容器/容器)
MDRectangleFlatButton:
text: 'Proceed To Next Page'
pos_hint: 'center_x':0.5, 'center_y':0.4
font_size : 20
on_press:
<AccountScreen>:
name: 'account'
FloatLayout:
MDLabel:
text: 'Accounts Page Test'
halign: 'center'
root.manager.current = 'account'
root.add_table()
BoxLayout:
id: table_holder
Python修改(在MenuScreen中创建方法)
class MenuScreen(Screen):
def add_table(self):
account_screen_ref = self.manager.get_screen('account')
account_screen_ref.ids['table_holder'].add_widget(account_screen_ref.table)
class AccountScreen(Screen):
def on_kv_post(self):
rows = []
self.table = MDDataTable(pos_hint='center_x': .5, 'center_y': .6,
size_hint=(.9, 0.7),
check=True,
rows_num=30,
column_data=[
("Type.", dp(38)),
("Balance", dp(20)),
("Date", dp(20)),
("id", dp(20))
],
row_data=rows
)
self.table.bind(on_check_press=self.check_press)
self.table.bind(on_row_press=self.row_press)
close_button1 = MDFlatButton(text='Close', on_release=self.close_view)
【讨论】:
对不起,我在哪里将表定义为 MDDataTable?它应该在课堂上吗? 我建议在您添加它的屏幕的on_kv_post()
中定义它,因为它只会在屏幕“发布”时发生一次,并保留类引用并使用self 定义时,因此您可以轻松访问小部件并将其添加到布局中
@OliverGeorgeAlmonte,加起来也会有点大,所以用这个account_ref = self.manager.get_screen('account')
,然后用account_ref.ids['table_holder'].add_widget(account_ref.table_ref)
,account_ref.table_ref.open()
@OliverGeorgeAlmonte 我已经相应地编辑了代码以上是关于如何在另一个屏幕上制作 MDDataTable?的主要内容,如果未能解决你的问题,请参考以下文章
如何在屏幕中选择图像并使用 kivy 将其显示在另一个屏幕上?
如何在kivymd python的MDDataTable中以编程方式取消选中复选框
如何修复 Kivymd MDDataTable python3 的“内联错误”
如果我在另一个屏幕中,我如何获取屏幕的 MDTextField(或数据“登录”)的文本。 (基维/基维MD/Python)