雑にいうと Python で Flutter web みたいなことができる.

Build cross-platform apps in Python | Flet

Build web, desktop, and mobile apps in Python. Start in your browser with Flet Studio, create …

flet.dev favicon image flet.dev

とりあえずサンプルコードだけ載せておく.

import flet
from flet import IconButton, Page, Row, TextField, icons

def main(page: Page):
    page.title = "Flet counter example"
    page.vertical_alignment = "center"

    txt_number = TextField(value="0", text_align="right", width=100)

    def minus_click(e):
        txt_number.value = int(txt_number.value) - 1
        page.update()

    def plus_click(e):
        txt_number.value = int(txt_number.value) + 1
        page.update()

    page.add(
        Row(
            [
                IconButton(icons.REMOVE, on_click=minus_click),
                txt_number,
                IconButton(icons.ADD, on_click=plus_click),
            ],
            alignment="center",
        )
    )

flet.app(target=main)

Flutter の Widget 的なやつを Page class に add していくと良い感じに Frontend ができるという感じです. やはり Dart は採用しにくいというところもあると思うので,Python で雑というか簡単に Frontend ができるのは良いです.

k8s で動かすので下記のような Dockerfile を作ってええ感じに動かしています.

FROM python

WORKDIR /app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8550

CMD ["python", "./main.py"]

細かいことを書いておくと Flutter web のように Canvaskit or HTML どちらかを利用するか選択することができます. デフォルトは Canvaskit です.

残念ポイントとしては Flutter の SelectionArea は利用できません. Text class に Selectable option はありますが,DataTable を利用した時とかちょっとしんどいです. ErrorControl の部分では利用していそうなのでそのうち使えるようになることを祈っています.

個人的には普通に Flutter した方が良いと思うけど,Python でお手軽にというケースはままあるかと思うので頭の片隅に入れておいても良いと思いました.