【问题标题】:How can I make an MDDataTable in another screen?如何在另一个屏幕上制作 MDDataTable?
【发布时间】:2023-03-17 15:59:01
【问题描述】:

按下按钮后,我找不到将 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()

【问题讨论】:

    标签: kivy kivymd


    【解决方案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 我已经相应地编辑了代码
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2019-04-08
    • 2010-11-09
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多