You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Flet框架中page.overlay列表内的元素对齐至底部居中?

如何将Flet框架中page.overlay列表内的元素对齐至底部居中?

嘿,我完全懂你的困扰——把容器加到page.overlay后默认钉在左上角,改页面本身的对齐属性根本没用,因为overlay里的元素是独立定位的,和页面主体的对齐规则不搭边。别急,给你两个简单的解决办法,亲测有效:

方法一:用WindowAlign直接绑定窗口位置

这是最省心的方式,Flet提供了WindowAlign枚举,可以让元素直接相对于窗口边界定位,不管窗口怎么缩放都能保持位置。你只需要修改keyboard()函数里的容器配置,加上两行定位属性就行:

def keyboard():
    vk = ft.Container(
        content=ft.Column(
            controls=[
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
            ],
            expand=True,
            spacing=25,
        ),
        bgcolor='teal.5',
        width=ft.WindowWidth(1.0),  # 改成自适应窗口宽度,不用硬写page.window.width
        border=ft.border.all(4, 'teal'),
        border_radius=ft.border_radius.all(5),
        alignment=ft.alignment.bottom_center,
        # 新增这两行,绑定窗口底部居中
        left=ft.WindowAlign.CENTER,
        top=ft.WindowAlign.BOTTOM,
        # 可选:底部留20px间距,避免紧贴窗口边缘
        margin=ft.Margin(0, 0, 0, 20)
    )
    return vk

这里把width改成ft.WindowWidth(1.0)是为了让容器宽度自动跟随窗口变化,不用手动处理窗口 resize 事件,省心不少。

方法二:用外层容器铺满页面后对齐

如果你更喜欢用容器的对齐逻辑,也可以把你的键盘容器套在一个占满整个页面的外层容器里,利用外层容器的alignment属性来定位:

def keyboard():
    # 原来的键盘内容容器,保留所有配置
    kb_content = ft.Container(
        content=ft.Column(
            controls=[
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
            ],
            expand=True,
            spacing=25,
        ),
        bgcolor='teal.5',
        width=ft.WindowWidth(1.0),
        border=ft.border.all(4, 'teal'),
        border_radius=ft.border_radius.all(5),
        alignment=ft.alignment.bottom_center
    )
    # 外层容器:铺满整个页面,设置底部居中对齐
    outer_container = ft.Container(
        content=kb_content,
        expand=True,
        alignment=ft.alignment.bottom_center,
        margin=ft.Margin(0, 0, 0, 20)  # 可选底部间距
    )
    return outer_container

这个方法的逻辑是让外层容器占满整个窗口,然后把键盘容器“贴”在它的底部居中位置,效果和方法一完全一样,看你习惯哪种写法。

最后给你贴个修改后的完整代码,直接运行就能看到底部居中的键盘了:

import flet as ft

def main(page : ft.Page):
    def keyboard():
        vk = ft.Container(
            content=ft.Column(
                controls=[
                    ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                    ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                    ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                    ft.Row([ft.OutlinedButton('O', width=120, height=70) for i in range(12)], spacing=25),
                ],
                expand=True,
                spacing=25,
            ),
            bgcolor='teal.5',
            width=ft.WindowWidth(1.0),
            border=ft.border.all(4, 'teal'),
            border_radius=ft.border_radius.all(5),
            alignment=ft.alignment.bottom_center,
            left=ft.WindowAlign.CENTER,
            top=ft.WindowAlign.BOTTOM,
            margin=ft.Margin(0, 0, 0, 20)
        )
        return vk


    page.window.full_screen = True
    page.vertical_alignment = 'start'
    page.horizontal_alignment = 'center'
    page.padding = 0
    page.theme = ft.Theme(color_scheme_seed=ft.Colors.GREEN)


    def onbl(e):
        page.overlay.pop(0)
        page.update()

    def oncl(e):
        kb = keyboard()
        page.overlay.append(kb)
        page.update()


    tf = ft.TextField(
        label='Тыкни',
        on_focus=oncl,
        on_blur=onbl,
    )

    page.add( ft.VerticalDivider(), tf)


ft.app(main)

备注:内容来源于stack exchange,提问作者neversleep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 20:04:29