Flet controls

nØthing spec¡al by Jimsjoo·2024년 4월 11일

Flet

목록 보기
2/8

Flet앱은 컨트롤(controls)로 구성된다. UI(User interface)의 최상단 컨트롤은 Page이다. 컨트롤은 일반적인 파이썬의 클래스라서 속성매개변수를 생성자에 전달하면서 인스턴스를 만든다.

t = ft.Text(value="Hello, world!", color="green")

컨트롤을 생성하여 page에 추가하고 page를 업데이트하는 방식으로 UI를 만들어 나간다.

import flet as ft

def main(page: ft.Page):
    t = ft.Text(value="Hello, world!", color="green")
    page.controls.append(t)
    page.update()

ft.app(target=main)


업데이트는 컨트롤의 속성을 변경하고, 이를 UI에 반영하기 위해 사용한다.

t = ft.Text()
page.add(t) # it's a shortcut for page.controls.append(t) and then page.update()

for i in range(10):
    t.value = f"Step {i}"
    page.update()
    time.sleep(1)

위에서 Text컨트롤의 value속성을 loop안에서 변경하고 page의 update함수로 변경된 속성을 반영한다.

Page처럼 눈에 보이고 무슨 기능을 하는 게 아니라 다만 다른 컨트롤을 담을 수 있는 컨트롤을 컨테이너라고 하는 데, Row도 컨테이너 컨트롤이다.

page.add(
    ft.Row(controls=[
        ft.Text("A"),
        ft.Text("B"),
        ft.Text("C")
    ])
)

위는 Text컨트롤 3개를 담은 Row컨트롤을 page에 추가하는 것이다.
컨트롤은 사용자의 UI조작에 반응하는 이벤트핸들러를 가질 수 있다.

def button_clicked(e):
    page.add(ft.Text("Clicked!"))

page.add(ft.ElevatedButton(text="Click me", on_click=button_clicked))

위의 예에서 button_clicked()함수를 ElevatedButton컨트롤의 이벤트 핸들러로 지정하는 코드이다.

다음은 이벤트핸들러 관련하여 약간 복잡한 예이다.

import flet as ft

def main(page):
    def add_clicked(e):
        page.add(ft.Checkbox(label=new_task.value))
        new_task.value = ""
        new_task.focus()
        new_task.update()

    new_task = ft.TextField(hint_text="Whats needs to be done?", width=300)
    page.add(ft.Row([new_task, ft.ElevatedButton("Add", on_click=add_clicked)]))

ft.app(target=main)

위의 코드에선 TextField와 ElevatedButton을 Row에 추가하고 ElevatedButton의 이벤트핸들러로서 add_clicked()함수를 지정한다.

Flet는 TextField, Checkbox, Dropdown, ElevatedButton 등 여러 컨트롤을 제공한다.
다음은 사용자로부터 입력을 받고 버튼을 클릭하면 'Hello ***'와 같은 메시지를 만들어 Text컨트롤에 출력하는 예이다.

import flet as ft

def main(page):
    def btn_click(e):
        if not txt_name.value:
            txt_name.error_text = "Please enter your name"
            page.update()
        else:
            name = txt_name.value
            page.clean()
            page.add(ft.Text(f"Hello, {name}!"))

    txt_name = ft.TextField(label="Your name")

    page.add(txt_name, ft.ElevatedButton("Say hello!", on_click=btn_click))

ft.app(target=main)

다음은 Checkbox, Dropdown 사용 예이다.

import flet as ft


def main(page):
    def checkbox_changed(e):
        output_text.value = (
            f"You have learned how to ski :  {todo_check.value}."
        )
        page.update()

    output_text = ft.Text()
    todo_check = ft.Checkbox(label="ToDo: Learn how to use ski", value=False, on_change=checkbox_changed)
    page.add(todo_check, output_text)

ft.app(target=main)

import flet as ft


def main(page: ft.Page):
    def button_clicked(e):
        output_text.value = f"Dropdown value is:  {color_dropdown.value}"
        page.update()

    output_text = ft.Text()
    submit_btn = ft.ElevatedButton(text="Submit", on_click=button_clicked)
    color_dropdown = ft.Dropdown(
        width=100,
        options=[
            ft.dropdown.Option("Red"),
            ft.dropdown.Option("Green"),
            ft.dropdown.Option("Blue"),
        ],
    )
    page.add(color_dropdown, submit_btn, output_text)

ft.app(target=main)

profile
harmonized or torn between programming and finance

0개의 댓글