Skip to main content

Utility to build flet based UI application

Project description

目录

概要

Python有一个构建桌面UI程序的软件包,叫flet。 fletext是一个帮助你更容易的构建flet UI程序的软件包,它的基本思想是:

  • 组建的状态被认为是商业逻辑的投射。具体说,就是,组建的属性可以绑定到控制器的变量
  • 每当控制器的某些变量发生变化后,控制器可以更新某些变量的值,这个操作在on_variable_updated中,由控制器根据商业逻辑来实现。
  • 控制器的的某些变量可以被投射到组建的属性,这样,当相关的控制器变量被改变后,组建的状态就自动被更新了。

这个思想同传统的MVC的想法其实本质上是一样的。

组件描述符

组件描述符是JSON格式,你可以把它存放在YAML文件中。下面是一个例子

$type: Row
controls:
  - $type: TextField
    $refid: x
    label: Hello
  - $type: TextField
    $refid: y
    label: Hello
  - $type: Text
    $refid: sum
    value: 
  - $type: Button
    $refid: test
    content:
      $type: Text
      value: Open Dialog
  • ❔开头的属性直,表示它是一个context变量表达式
  • ❕开头的属性直,表示它是一个python变量表达式
  • $type表示组件类型
  • $refid表示组件的索引名称。在一个组件描述符中,所有的索引名称都是唯一的。

通过描述符加载组件

你需要调用函数load_component_from_descriptor,下面是一个例子:

# 加载YAML格式的组件描述符
with open(args.filename, "rt") as f:
    descriptor = yaml.safe_load(f)

# 配置context
context = {
    "DEFAULT_BORDER": ft.Border.all(2, ft.Colors.BLUE_GREY_200),
    "SYSTEM_MENU_STYLE": ft.MenuStyle(padding=0)
}

# 加载组件,加载后得到Component,其属性.ui才是flet的组建对象。
component = load_component_from_descriptor(descriptor, context=context)
page.add(component.ui)

控制器

Controller类代表了控制器。控制器负责控制商业逻辑。下面介绍一些控制器的函数。

set_variable

# 设置一个变量,变量的名字是"sum",变量的值被设置成0
my_controller.set_variable("sum", 0)

register_input_bind

# 变量同组建绑定,方向是 组建 --> 变量
# 创建一个变量,并且把这个变量同索引为"x"的组建联系在一起。当索引为"x"的组件的value属性发生变化的时候,变量"x"的值会会同它保持同步。
my_controller.register_input_bind("x")

register_output_bind

# 变量同组建绑定,方向是 变量 --> 组建
# 创建一个变量,并且把这个变量同索引为"sum"的组建联系在一起。当变量的值发生变化时,组建的value属性会同变量的值保持同步。
my_controller.register_output_bind("sum")

例子

这个例子是一个加法起,你可以输入x和y的值,它们必须是整数。然后你会看到x+y被显示。 文件名称: add.py

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import yaml
import flet as ft

import argparse

from fletext import load_component_from_descriptor, Controller, HANDLER_TYPE, Component

class MyController(Controller):
    def __init__(self, page:ft.Page, component: Component):
        super().__init__(page, component)

        self.set_variable("sum", "sum=0")
        self.register_input_bind("x")       # 组建"x"的value属性会被自动复制到变量"x"
        self.register_input_bind("y")       # 组建"x"的value属性会被自动复制到变量"x"
        self.register_output_bind("sum")    # 变量"sum"的值会被自动复制到组件"sum"的value属性


    def on_variable_updated(self, variable_name:str):
        # 每次有变量发生变化,这个函数会被执行
        # 它负责保证变量之间应有的逻辑关系
        x = 0
        try:
            x = int(self.get_variable("x"))
        except ValueError:
            pass

        y = 0
        try:
            y = int(self.get_variable("y"))
        except ValueError:
            pass
        
        # 我们模拟一个加法起, sum = x + y
        self.set_variable("sum", f"sum={str(x + y)}")
    
    


def main(page: ft.Page):
    page.title = "My Sample Page"
    page.theme_mode = ft.ThemeMode.LIGHT
    page.theme = ft.Theme(color_scheme_seed=ft.Colors.INDIGO)

    # 加载组件描述符
    with open("page.yaml", "rt") as f:
        descriptor = yaml.safe_load(f)

    context = {
        "DEFAULT_BORDER": ft.Border.all(2, ft.Colors.BLUE_GREY_200),
        "SYSTEM_MENU_STYLE": ft.MenuStyle(padding=0)
    }

    component = load_component_from_descriptor(descriptor, context=context)
    my_controller = MyController(page, component) # 创建控制器
    page.add(component.ui)
    


if __name__ == '__main__':
    ft.app(target=main)

文件名称: `page.yaml` ```yaml $type: Row controls: - $type: TextField $refid: x label: X - $type: TextField $refid: y label: Y - $type: Text $refid: sum value: sum=0 ```

如果要运行这个程序,可以参考下列步骤:

# 现创建python虚拟环境
python3 -m venv .venv
source .venv/bin/activate
pip install pip --upgrade
pip install pyyaml flet fletext
python add.py

这是这个程序运行后的屏幕:
screen

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fletext-0.1.6.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fletext-0.1.6-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

File details

Details for the file fletext-0.1.6.tar.gz.

File metadata

  • Download URL: fletext-0.1.6.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for fletext-0.1.6.tar.gz
Algorithm Hash digest
SHA256 bce3811d552dadf9a757cbd56068be7e317b01c5cf38aefca9d5c3647c1b0f1a
MD5 616f92282a9f82addc6df526f7fdd239
BLAKE2b-256 e44a193acdfb86fd14ea0a8b7a1d0ad055b331d3e94de998448b1084f4e95079

See more details on using hashes here.

File details

Details for the file fletext-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: fletext-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 7.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for fletext-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 fc27ce298eea6906cda97c568216da78cb865fda7e22527a84da72b0b3a0cc7f
MD5 c9528d43a0250c2a68a110e701a79639
BLAKE2b-256 e5bf6ec7e9969e1e0289e1f1bbf08e597a0c18ceff958055c4a1292b439620a8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page