首页 > 其他分享 >Flet 快速上手

Flet 快速上手

时间:2024-09-29 10:14:37浏览次数:7  
标签:control ft self Flet flet 快速 page

Flet 快速上手

Flet 是什么?

Flet 是一个 UI 框架,允许你使用 Python 来构建 Web、桌面端和移动端应用。

构建第一个 Flet 应用

下面将构建我们的第一个 Flet 应用,该应用只有一个简单的计数功能。

首先我们需要执行命令 pip install flet 来安装 flet。然后我们创建一个 counter.py 文件用于实现我们的计数 app。在 counter.py 中加上如下代码:

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 = str(int(txt_number.value) - 1)
        page.update()

    def plus_click(e):
        txt_number.value = str(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)

接下来只需要使用命令 python counter.py 即可运行我们的第一个 flet 应用了。

Flet counter example

在实际开发中使用 flet create <project-name> 来创建一个 flet 项目,使用 flet run 来运行 flet 项目。

基本概念

Controls

用户界面在 Flet 中是由一个一个的 control 组成的,control 只能在 control 内,其中 Page 是最顶级的 control,也就是说用户看到的界面其实是一棵 control 树。下述代码就是将一个 Text control 加入到 Page 内,然后调用 update 来更新界面:

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)

上述代码中 Text 就是 Flet 提供的 control,我们也可以自定义 control 来灵活实现需求:

class MyButton(ft.ElevatedButton):
    def __init__(self, text):
        super().__init__()
        self.bgcolor = ft.colors.ORANGE_300
        self.color = ft.colors.GREEN_800
        self.text = text     

在自定义的 ByButton 中会继承 Flet 的 ElevatedButton control 然后修改其字体和背景色。

control 还提供了一些钩子函数:

  • build:创建 control 时调用

  • did_mount:control 被挂载后调用

  • will_unmount:移除 control 后调用

  • before_update:更新 control 前调用

Adaptive apps

Flet 框架提供了多平台自适应功能,此功能默认为关闭状态,将 page.adaptive 设置为 True 将开启自适应功能。开启自适应功能后一些 controls 在 IOS 和其它平台中显示样式会不一样。Flet 提供的自适应 control 请阅读文档:Material and Cupertino controls

除此之外我们可以自定义 control 来实现多平台适配。在自定义 control 中检查 self.page.platform 来区分程序当前运行的平台:

class AdaptiveNavigationBarDestination(ft.NavigationBarDestination):
    def __init__(self, ios_icon, android_icon, label):
        super().__init__()
        self._ios_icon = ios_icon
        self._android_icon = android_icon
        self.label = label

    def build(self):
        # we can check for platform in build method because self.page is known
        self.icon = (
            self._ios_icon
            if self.page.platform == ft.PagePlatform.IOS
            or self.page.platform == ft.PagePlatform.MACOS
            else self._android_icon
        )

Flet 提供了路由功能。Flet 提供了两种路由模式:

  • Path:普通路由,如:/post/1

  • Hash:哈希路由,如:/#/post/1

我们可以通过page.route属性来获取当前页面的路由同时也能修改此熟悉从而实现跳转路由的功能。Flet 还提供了 page.on_route_change来监听路由变化。使用 page.on_view_pop可以获取上一个页面试图。

import flet as ft

def main(page: ft.Page):
    page.add(ft.Text(f"Initial route: {page.route}"))

    def route_change(e: ft.RouteChangeEvent):
        page.add(ft.Text(f"New route: {e.route}"))

    def go_store(e):
        page.route = "/store"
        page.update()

    page.on_route_change = route_change
    page.add(ft.ElevatedButton("Go to Store", on_click=go_store))

ft.app(target=main, view=ft.AppView.WEB_BROWSER)

打包 Flet 项目

Flet 打包程序提供了两种方法

  • flet pack main.py:这是旧的打包 flet 程序命令,依赖 pyinstaller。注意:这种方法方法打包优点是较为简单,缺点是打包出的程序性能较差(简单 demo 打包后打开时间要七秒左右,使用 flet build 打包仅一秒多即可打开)

  • flet build macos:这是新打包命令,依赖 Flutter。

Flet pack demo

下述示例是基于 MacOS 14 m2 芯片构建

使用 flet pack 命令打包程序前需要先使用 pip install pyinstaller命令来安装 pyinstaller 依赖。然后执行 flet pack main.py 即可打包程序。 命令详情参考文档:packaging-desktop-app

Flet build demo

下述示例是基于 MacOS 14 m2 芯片构建

环境准备

  • 网络环境:打包构建过程中会使用到一些外网依赖故需要提前配置网络代理,配置方法可参考命令export http_proxy=http://127.0.0.1:1087;export https_proxy=http://127.0.0.1:1087对应端口为本机实际代理端口。

  • Flutter 环境:由于 Flet 打包构建实际是使用 Fletter,故我们需要配置 Flutter 环境。

    • 下载安装 Flutter SDK:install-the-flutter-sdk 打开链接后选择 Download and install 中 arm 版本压缩包下载解压。然后如下环境变量:

      • export PUB_HOSTED_URL=https://pub.flutter-io.cn

      • export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

      • export PATH="{flutter sdk 安装目录}/bin:$PATH"

    • 打开 AppStore 商店安装 Xcode,用于编译 Swift,安装过程可能会让你升级操作系统。

    • 安装 CocoaPods 用于编译 Flutter,CocoaPods 其作用为管理依赖。

    • how-it-workshttps://flet.dev/docs/publish#how-it-works

打包

使用名flet build <target_platform>即可打包 Flet 项目,具体打包命令参考文档:how-it-works

Github Action demo

由于 flet pack 打包性能较差,故 github action 打包构建将使用 flet build 方式进行。

name: Test build

on:
  release:
    types: [ created ]

  # Allows you to run this workflow manually from the Actions tab of the repository
  workflow_dispatch:

# flet build macos --verbose --build-number=1 --build-version=1.0.0
env:
  PYTHON_VERSION: 3.11.9
  FLUTTER_VERSION: 3.24.0

jobs:
  build-macos:
    strategy:
      matrix:
        os: [macos-14]  # 定义多个 macOS 版本,macos-14是m1芯片即arm64
    runs-on: macos-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Setup Python ${{ env.PYTHON_VERSION }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ env.PYTHON_VERSION }}

    - name: Install Python Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Setup Flutter ${{ env.FLUTTER_VERSION }}
      uses: subosito/flutter-action@v2
      with:
        flutter-version: ${{ env.FLUTTER_VERSION }}

    - name: Flet Build macOS
      run: |
        flutter config --no-analytics
        flet build macos --verbose

    - name: Package .app folder
      run: |
         cd build/macos
         tar -czf test.tar.gz test.app
         cd ../
         cd ../
         mkdir dist
         cp build/macos/test.tar.gz dist/test.tar.gz

    - name: Upload Release Asset
      id: upload-release-asset
      uses: actions/upload-release-asset@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ github.event.release.upload_url }}
        asset_path: ./dist/test.tar.gz
        asset_name: test-${{ matrix.os }}.tar.gz
        asset_content_type: application/octet-stream

参考资料

  1. https://flet.dev/docs

  2. https://docs.flutter.dev/get-started/install/macos/desktop

  3. https://cocoapods.org

标签:control,ft,self,Flet,flet,快速,page
From: https://www.cnblogs.com/takagi/p/18438998

相关文章

  • python内置模块typing里Literal函数的基本用法和总结--快速学习掌握Literal函数的用法
    Literal是Pythontyping模块中提供的一种类型注解,用于指定变量或函数的参数只能取特定的字面量值(常量)。它允许你将变量的取值严格限制在指定的一组值内,确保程序只接受特定的常量值,从而减少错误的发生。一、基本概念在Python中,通常我们会使用常见的类型注解来限制变量......
  • idea快速生成的代码
    importjava.util.Objects;publicclassStudent{privateStringsid;privateStringname;privateintage;privateStringaddress;publicStudent(Stringsid){this.sid=sid;}publicStudent(Stringsid,Stringn......
  • Blender快速入门教程1简介
    0简介Blender是最著名的3D计算机图形制作免费程序之一。有了Blender,你可以创建角色、道具、环境以及你的想象力所能产生的几乎所有其他东西。它不仅可以创建对象。你还可以让它们运动起来。在动画中讲述一个故事,带领人们穿越你自己创造的世界,或者为一些视频片段添加特效。一......
  • 妙用编辑器:使用Notepad--正则表达式从命令结果报文快速生成新命令
    应用场景日常生活中有些维护场景,比如检查设备状态,执行查询命令后,得到精简结果报文,如果要更深入的检查状态,可能还要执行其他命令,逐个对象进行查询,这里涉及到快速从报文生成查询指令的功能。比如有如下一个从LST命令查询出来的报文,需要快速的生成DSP命令,逐个Subrack进行查询。RE......
  • 如何快速免费搭建自己的Docker私有镜像源来解决Docker无法拉取镜像的问题(搭建私有镜像
    文章目录......
  • 揭秘巨量千川涨粉的完整操作步骤 快速涨1000粉 10000粉 安全可靠不影响账号
    在当今竞争激烈的环境下,创作者们面临着巨大的用户增长挑战,快速涨粉成为一道难题。而抖音巨量千川投流则为大家带来了完美解决方案,以官方真实投放的优势,实现每日涨粉1000至10万的真实活跃粉丝效果,让创作者们获得官方认可流量,亲身体验抖音涨粉的魅力。千川投流快速起飞下面......
  • AI绘画SD和MJ零基础入门到精通教程,这些技巧让你的画作更惊艳!这些指令快速激发你的创作
    ‍......
  • 征程 6E/M 快速上手实战 Sample-Camera
    01Camera模块简述本文档简单介绍Camera子系统软件架构、列出已支持的Camera模组,并提供相应的配置说明,同时引用Sensor点亮调试方法介绍一颗新模组接入的步骤,再按根据重要功能按专题介绍接入方案限制、EMB接收等,并最终汇总平台已有单板的Camera接入使用说明,用于指导征......
  • 亚马逊新手运营5个思路!如何快速出单?
    众所周知,电商运营的基本逻辑看似简单:流量、转化率和利润率的结合等于盈利。然而,这个等式背后隐藏的复杂性常常让新手运营者感到困惑。他们可能会发现,尽管他们努力增加流量、提高转化率和调整利润率,但仍然无法实现预期的收益。问题出在哪里?答案是:运营思维的单一化和对运营要素......
  • FB如何快速开发客户
    hello,我是Lukina!今天咱们来聊聊如何在Facebook上快速找到潜在客户,也是我个人的一些经验哦!希望能对像我一样的外贸人,尤其是外贸小白有些帮助吧!   1.找到你的群组:搜索产品关键词、行业关键词或者国家名,可以精准定位这个国家对这个产品有需求的小组。2.加入并活跃:选择活......