如何获取添加到页面的所有控件的列表/树以及如何访问其中之一

问题描述 投票:0回答:1

我使用 Flet Python 开发了一个简单的应用程序。该应用程序包含一些控件,例如按行和列组织的文本和按钮。这是我的代码:

import flet as ft

def main(page: ft.Page):
    def Next_Image(e):
        print(page.controls)        

    # CONTROLS DESIGN
    cont = ft.Container(bgcolor=ft.colors.AMBER,
                    border=ft.border.all(3, ft.colors.RED),
                    width=250,
                    height=600,
                    )

    button_previous_img = ft.IconButton(icon=ft.icons.ARROW_CIRCLE_LEFT, tooltip='Previous Image')
    button_next_img = ft.IconButton(icon=ft.icons.ARROW_CIRCLE_RIGHT, tooltip='Next Image', on_click=Next_Image)
    text_num_img = ft.Text(value="DOC")

    # ADD CONTROLS TO THE PAGE
    page.add(
        ft.Column(
            [
                cont,
                ft.Row(
                    [
                        button_previous_img,
                        text_num_img,
                        button_next_img
                    ],
                    alignment=ft.MainAxisAlignment.CENTER,
                )
            ],
            horizontal_alignment = ft.CrossAxisAlignment.CENTER,
        )

    )
    page.update()


ft.app(target=main)

我想检索按按钮添加到页面的整个子控件树。我只能显示最外面的控件,特别是列。 此外,我想访问一个控件,假设按钮事件“Next_Image()”内的容器“cont”。有没有办法使用名称变量或其在控件集合中的索引来访问他?如:

cont = page.controls["cont"] # with the variable name
cont = page.controls["4"] # with the variable index (assuming it's 4)
python flutter flet
1个回答
0
投票

如果你想要控件树,你可以使用这个:

    def get_tree(controls, indent=""):

        indent = indent + "\t"

        for con in controls:
            print(f"{indent}{con._get_control_name()}")
            if hasattr(con, 'controls'):
                if len(con.controls) > 0:
                    get_tree(con.controls, indent)
            elif hasattr(con, 'content'):
                if hasattr(con.content, 'controls'):
                    if len(con.content.controls) > 0:
                        get_tree(con.content.controls, indent)
            else:
                continue

    get_tree(page.controls)

代码通过

controls
打印它们并打印它们的子项并更深入等等。

为了通过索引进行控制,您可以使用

cont = page.controls[0].controls[0] 
如果你想得到
cont
。 通过
page.controls[0]
,你进入
ft.Column
,然后你想要
ft.Column
的孩子,所以你使用
page.controls[0].controls[0]
,你就得到了你想要的

© www.soinside.com 2019 - 2024. All rights reserved.