跳到主要内容

Flet 图表

· 阅读需 3 分钟
Feodor Fitsner
Flet 创始人兼开发者

去年,我们引入了对 Matplotlib 和 Plotly 图表 的支持。两个库都能够将图表导出为 SVG 图像,并在 Flet 应用中显示。然而,这些图表在可视化方面虽然能够满足需求,但缺乏交互性和动画效果。

今天,我们发布了基于出色的 fl_chart 库的内置图表 📊 的 Flet 0.5.2 版本!

我们引入了三个新的图表控件:

折线图(LineChart)

文档 · 示例

柱状图(BarChart)

文档 · 示例

饼图(PieChart)

文档 · 示例

备注

我们花了很多时间研究 fl_chart 库,并尝试以 Flet 的方式实现其大部分功能。然而,如果您发现 Flet 中缺少任何功能,而这些功能在库中可用,请 提交新的功能请求

其他变更

Pyodide 0.23

Pyodide是一个在浏览器中提供Python运行时的工具,用于将Flet应用作为静态网站运行。它已经升级到0.23版本,该版本基于Python 3.11.2,并且带来了一些大小和性能改进

内存泄漏修复

在这个版本中,我们非常关注 Flet 应用中的内存泄漏问题。现在,当用户会话关闭时,其内存会被可靠地释放并进行垃圾回收。这使得 Flet 准备好应用于拥有大量用户的生产应用。

升级 Flet 模块到最新版本(pip install flet --upgrade),尝试一下新图表,并 告诉我们 您的想法!

嘿,Flet 项目 已经达到了 ⭐️ 5000 星 ⭐️ - 感谢大家的持续支持!

使用 Pyodide 构建独立的 Flet Web 应用

· 阅读需 6 分钟
Feodor Fitsner
Flet 创始人和开发者

我们刚刚发布了Flet 0.4.0,它具有一个超级令人兴奋的新功能 - 将 Flet 应用打包成独立的静态网站,可以完全在浏览器中运行!该应用可以发布到任何免费的静态网站托管,如 GitHub Pages 或 Cloudflare Pages。这要归功于 Pyodide - 一个 WebAssembly 的 Python 移植版!

您可以快速构建完全用 Python 编写的精彩单页应用(SPA),并将其托管在任何地方!无需 HTML、CSS 或 JavaScript!

快速示例:使用Pyodide创建Flet应用

安装最新的 Flet 包:

pip install flet --upgrade

创建一个简单的 counter.py 应用:

counter.py
import flet as ft

def main(page: ft.Page):
page.title = "Flet 计数器示例"
page.vertical_alignment = ft.MainAxisAlignment.CENTER

txt_number = ft.TextField(value="0", text_align=ft.TextAlign.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(
ft.Row(
[
ft.IconButton(ft.icons.REMOVE, on_click=minus_click),
txt_number,
ft.IconButton(ft.icons.ADD, on_click=plus_click),
],
alignment=ft.MainAxisAlignment.CENTER,
)
)

ft.app(main)

运行全新的 flet publish 命令,将 Flet 应用发布为静态网站:

flet publish counter.py

网站将发布到与 counter.py 同级的 dist 目录中。 使用内置的Python Web服务器进行测试:

python -m http.server --directory dist

打开浏览器中的 http://localhost:8000 以检查已发布的应用。

以下是一些托管在 Cloudflare Pages 上的实时 Flet 应用:

查看指南 了解更多关于将 Flet 应用发布为独立网站的信息。

Python 中的内置 Fletd 服务器

Flet 0.4.0 还实现了新的 Flet 桌面架构

它用一个轻量级的Python代码替换了Go编写的Fletd服务器,带来了如下优点:

  1. 运行 Flet 应用只需要两个系统进程:Python 解释器和 Flutter 客户端。
  2. 更少的通信开销(减少了 Python 和 Fletd 之间的两次网络跳跃)和更低的延迟(桩代码在 Windows 上使用 TCP,在 macOS/Linux 上使用 Unix 域套接字)。
  3. 默认情况下,桩代码绑定到 Windows 上的 127.0.0.1,更加安全。
  4. 使用 flet pack 生成的独立应用程序包的大小减少了约 8 MB。

该实现还支持 Pyodide(我们不能在浏览器中运行 Go Web 服务器,对吧?),为 iOS 和 Android 支持铺平了道路。

其他更改

  • 所有从 Web URL 加载资源的控件(Image.srcAudio.srcPage.fontsContainer.image_src)现在也可以从本地文件加载资源,方法是提供文件系统中的完整路径,以及通过提供相对路径从 assets 目录中加载资源。对于桌面应用程序,src 属性中的路径可以是以下之一:
    • 相对于 assets 目录的路径,带或不带开始的斜杠,例如:/image.pngimage.png。不应包含工件目录的名称。
    • 计算机文件系统中的绝对路径,例如 C:\projects\app\assets\image.png/Users/john/images/picture.png
    • 完整的 URL,例如 https://mysite.com/images/pic.png
    • 添加 page.on_error = lambda e: print("页面错误:", e.data) 以查看失败的图像。
  • flet Python 包分为两个包:flet-coreflet
  • 用 Poetry 替换 PDM。
  • beartype 已全面移除。

💥 重大更改

  • 默认路由方案从“hash”更改为“path”(应用 URL 末尾没有 /#/)。使用 ft.app(main, route_url_strategy="hash") 可获得原始行为。
  • 独立桌面 Flet 应用中不再支持 OAuth 认证。

异步支持

Flet 应用现在可以编写为异步应用,并与其他 Python 异步库一起使用 asyncio。在 Flet 中自然支持调用协程,因此无需包装它们以同步运行。

要开始使用异步 Flet 应用,您应该使 main() 方法成为 async

import flet as ft

async def main(page: ft.Page):
await page.add_async(ft.Text("Hello, async world!"))

ft.app(main)

阅读指南 了解更多关于编写异步 Flet 应用的信息。

结论

Flet 0.4.0 带来了以下令人兴奋的功能:

  • 使用 Pyodide 构建在浏览器中运行的独立 Web 应用并托管在廉价的托管上。
  • 具有内置 Fletd 服务器的更快和更安全的架构。
  • 异步应用支持。

将 Flet 模块升级到最新版本(pip install flet --upgrade),尝试 flet publish 命令并告诉我们 您的想法!

顺便说一句,Flet 项目 已经达到了 ⭐️ 4.2K 星 ⭐️(仅一个月增加了 1K) - 继续加油!

使用自定义图标打包桌面应用程序

· 阅读需 2 分钟
Feodor Fitsner
Flet 创始人兼开发者

新年快乐!Flet 项目 在 GitHub 上达到了 ⭐️ 3.3K 星 ⭐️,这非常令人兴奋和鼓舞!感谢大家的支持!

我们从发布 Flet 0.3.2 开始新的一年,这次更新带来了一个期待已久的功能:创建具有自定义图标的独立桌面软件包!

flet 命令一直用于运行带有热重载的 Flet 程序,但我们最近重新设计了 Flet CLI,以支持多种操作。

新增的 flet pack 命令封装了 PyInstaller API,将您的 Flet Python 应用程序打包成独立的 Windows 可执行文件或 macOS 应用程序包,用户无需安装 Python 即可运行。

命令的 --icon 参数不仅改变了可执行文件的图标,还改变了 Flet 的应用程序窗口图标以及在 macOS Dock、Windows 任务栏、macOS "关于" 对话框、任务管理器和活动监视器中显示的图标:

还可以更改包名称、版本和版权信息:

更新的指南中查找所有可用的桌面应用程序打包选项。

将 Flet 模块升级到最新版本 (pip install flet --upgrade),试一试 flet pack 命令,并告诉我们您的想法!

Flet 移动端更新

· 阅读需 8 分钟
Feodor Fitsner
Flet 创始人和开发者

本文是几个月前发布的Flet 移动端战略的延续。

我们最初在移动设备上运行 Flet 的方法是服务器驱动的 UI(SDUI)。尽管 SDUI 有其自身的优点(比如绕过应用商店进行应用更新),但它并不适用于所有情况,需要 Web 服务器来托管应用程序的 Python 部分,并且由此增加了响应延迟,这对于需要几乎即时 UI 响应的用户操作(如绘图应用程序)并不理想。

我一直在思考如何将 Python 运行时嵌入到 Flutter iOS 或 Android 应用程序中以运行用户的 Python 程序。毫无疑问,从技术上讲是可行的,因为 Kivy 和 BeeWare 项目已经实现了这一点。

当前的 Flet 架构

当前 Flet 桌面应用程序的架构如下图所示:

在桌面上运行 Flet 程序涉及到三个应用程序(进程)协同工作:

  • Python 运行时 (python3) - 运行您的 Python 脚本的 Python 解释器。这是您从命令行启动的内容。Python 启动 Fletd 服务器并通过 WebSockets 连接到它。
  • Fletd 服务器 (fletd) - 使用 Go 编写的 Flet Web 服务器,监听一个 TCP 端口。Fletd 保存所有用户会话的状态(对于桌面应用程序只有一个会话),并在 Python 程序和 Flet 客户端之间分发页面更新和用户生成的事件。
  • Flet 客户端 (flet) - 使用 Flutter 编写的桌面应用程序,在本地操作系统窗口中显示 UI。Flet 客户端通过 WebSockets 连接到 Fletd 服务器。

上述架构对于 Flet Web 应用程序效果良好,因为 Web 服务器是必要的一部分,但对于桌面应用程序来说似乎是多余的:

  • 如果所有三个进程在同一台计算机上运行,WebSockets 可以用消息传递队列或命名管道替代,减少开销。
  • 对于只有一个用户会话且 UI 状态永久存储在 Flet 桌面客户端中且从不“重新加载”的桌面应用程序来说,Fletd 服务器没有多大意义。

新的 Flet 桌面架构

通过将 Fletd 替换为用 Python 编写的“存根”,并通过 sockets(Windows)和 named pipes(macOS 和 Linux)与 Flet 桌面客户端通信,可以简化 Flet 桌面应用程序的架构:

Flet 移动架构

移动应用程序在非常严格的环境中运行,有许多限制。例如,在 iOS 上,应用程序无法生成新进程。换句话说,Flet Flutter 应用程序不能简单地启动“python.exe”并将您的脚本作为参数传递。

幸运的是,Python 可以被嵌入到另一个应用程序作为 C 库,并且 Dart(Flutter 应用程序编写的语言)允许通过FFI(外部函数接口)调用 C 库。

此外,尽管 Android 允许动态链接库的加载,但 iOS 要求所有库都静态链接到应用程序可执行文件中。这篇文章更详细地介绍了 Dart FFI,如果您感兴趣的话。

Flet 移动架构可能如下所示:

Python 运行时将与 Flutter 客户端应用程序静态或动态链接,并通过 FFI 和/或具名管道进行调用。

尽管在移动设备上运行 Python 存在一些限制。最重要的限制之一是要求使用适用于移动设备 ARM64 架构的“纯” Python 模块或使用专门为移动设备编译的具有本机代码的模块。

异步支持

Asyncio 是 Python 3 的一部分,我们开始看到越来越多的库开始适应 async/await 编程模型,这对于 I/O 绑定和 UI 逻辑更有效。

目前,Flet在新线程中生成所有UI事件处理程序,而且随处可见threading.sleep()调用阻塞线程,仅仅是为了进行一些UI动画。所有这些看起来都很费资源。

使用异步库的异步代码 是可能的,但看起来很别扭且效率低下,因为它让 CPU 忙于等待异步方法完成。因此,我们希望 Flet 应用程序能够对异步代码提供一流支持。

异步/等待模型是在单个线程中切换任务的状态机。通过采用异步方式,Flet 将能够利用处理套接字服务器,并使用异步WebSockets 库库。它将能够在单个 Flet 应用程序中同时使用同步和异步事件处理程序,而无需任何妥协或黑客手段。

更令人兴奋的是,异步 Flet 将能够完全在Pyodide内运行,Pyodide 是基于 WebAssembly(WASM)的 Python 发行版。WebAssembly 尚无多线程支持,因此在单个线程中运行是必须的。想象一下,具有真正离线 Flet PWA 的 Flet Web 应用程序,它不需要 Web 服务器来运行 Python 代码!

开发计划

我们将在几个迭代中压缩上面的范围:

  1. 支持异步API,并使用异步WebSockets库。与Go中的相同Fletd一起工作。
  2. 使用Python的Fletd服务器("存根")与桌面应用程序一起使用。
  3. 将Python与Fletd“存根”和用户程序嵌入iOS中。
  4. 将Python嵌入Android中。
  5. 为iOS和Android打包移动应用程序。
寻求帮助

🙏 我正在寻求社区在开发 Flutter 和 Python 在 iOS 和 Android 之间的 C/C++/本机代码集成方面的帮助。这可以是免费帮助或有偿工作 - 如果您有兴趣,请告诉我!

请访问 Discord 讨论该计划,提供帮助,提出问题!

Flet版本控制与预发布

· 阅读需 3 分钟
费奥多·菲茨纳 (Feodor Fitsner)
Flet 创始人和开发者

Flet是一个快速发展的框架,每隔一天都会提交新功能和错误修复。

每个版本发布一个拉取请求的开发模型对项目来说效果不好,因为用户需要等待数周才能获得新版本,而且从开发角度来看,发布大型的“英勇”版本需要耗费很多精力 🫠。

从现在开始,我们将把发布拆分为多个拉取请求,每个拉取请求一个功能/错误修复。

每个合并到main分支的拉取请求将会发布一个预发布(开发中的版本)包到pypi.org,版本格式为X.Y.Z.devN

安装预发布版本

要安装Flet的预发布版本,请使用以下命令:

pip install flet --pre
信息

我们建议将预发布版本构建安装到虚拟环境中。

Flet版本控制

Flet将切换到语义化版本,版本号为 主版本.次版本.修订版本

  1. 当有“不兼容的API更改”时,将增加 主版本。现在它是 0,我们预计当Flet API足够稳定时将其设为 1
  2. 当以向后兼容的方式添加新功能时,将增加 次版本
  3. 当进行向后兼容的错误修复时,将增加 修订版本

根据这个规则,即将发布的Flet版本将是 0.2.0。该版本的错误修复将标记为 0.2.10.2.2 等。该版本之后的发布将是 0.3.0,以此类推。

Flet预发布版本的格式将为 主版本.{上一次次版本 + 1}.0.dev{构建},其中 上一次次版本 是上一个发布的 次版本{构建} 是由CI设置的构建号。例如,如果上次发布的版本是 0.1.65,预发布版本将具有版本 0.2.0.dev{构建}。发布 0.2.0 之后的预发布版本将标记为 0.3.0.dev{构建}