如何在另一个屏幕上制作 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何为iOS设备制作录屏指导视频

如何动态更改 MDDataTable 值

如何在屏幕中选择图像并使用 kivy 将其显示在另一个屏幕上?

如何在kivymd python的MDDataTable中以编程方式取消选中复选框

如何修复 Kivymd MDDataTable python3 的“内联错误”

如果我在另一个屏幕中,我如何获取屏幕的 MDTextField(或数据“登录”)的文本。 (基维/基维MD/Python)