ARTICLE · 1133662
会 Python 就能做 App!Flet:一套代码跑通桌面+手机+网页,前端零基础也能上手
写 Python 的人,几乎都卡在同一个地方:
逻辑半小时写完,卡在界面上三天——Tkinter 那套灰扑扑的控件,实在不好意思发给同事。 想换 PyQt,Licensing 要研究、打包体积劝退、信号槽还得重新学一遍。 工具做出来挺好用,想给手机也整一份——那得再学 Kotlin 或 Swift,直接放弃。 想顺手做个网页版,HTML / CSS / JS 三件套又得从头啃。 用 Electron 套壳,一个空壳就上百 MB,还得先装 Node 环境。
拦住你的从来不是不会写代码,而是"代码后面的那张脸"。
今天给你安利一个专门解决这件事的框架——Flet。
界面和业务逻辑全用 Python 写,底层交给 Flutter 负责渲染,一套代码可以跑在桌面、Web 和移动端。 Dart、Swift、Kotlin、HTML、JavaScript,都不用碰。
有一点得先讲清楚,免得你误解它的工作原理:Flet 不是"把 Python 编译成 Flutter 应用",而是"Python 跑逻辑 + Flutter 渲染界面"两套运行时并存,中间靠一层协议同步状态。 这个结构直接决定了它的长处和短板,后面几节都会绕着它说。
“先说个时间点:Flet 在 2026 年 9 月 15 日正式发布 1.0,官方称其为"可以用于生产环境"的版本。截至发稿,GitHub 上已有 16,700+ Star、9,000,000+ 次 PyPI 下载、100 位贡献者、6,000+ Discord 成员。
1.0 是个分水岭:在此之前它是"好玩的框架",在此之后它有了成熟的测试体系和兼容性承诺。如果你以前看过 Flet 又犹豫过,现在是个合适的重新评估时间点。
另外提醒一句:软件迭代很快,本文基于 2026 年 10 月初的信息,动手前建议先到官网或 PyPI 确认最新版本,别照着旧文章配环境。

✏️ 一、跑起来只要两条命令
先装依赖(Python 需要 3.10 或更高):
pip install 'flet[all]'这里的 [all] 是把四个包一次装齐:flet(库本身)、flet-cli(create/run/build/test 这些命令)、flet-desktop(桌面客户端)、flet-web(Web 客户端)。只写 pip install flet 就只有库,flet run 会额外去补装缺的包。
“如果你已经在用
uv,还有个更省事的路子:uvx --with flet-cli flet doctor,连虚拟环境都不用自己建。
然后把官方那个最经典的计数器例子存成 counter.py:
import flet as ftdefmain(page: ft.Page): counter = ft.Text("0", size=50, data=0)defincrement_click(e): counter.data += 1 counter.value = str(counter.data) page.floating_action_button = ft.FloatingActionButton( icon=ft.Icons.ADD, on_click=increment_click, ) page.add( ft.SafeArea( expand=True, content=ft.Container( content=counter, alignment=ft.Alignment.CENTER, ), ) )ft.run(main)然后:
flet run counter.py一个原生桌面窗口就弹出来了,点右下角那个加号,数字往上跳。

想换成浏览器版?加一个参数就行:
flet run --web counter.py同一个文件,桌面窗口和浏览器页面,切换只差 --web 这五个字符。

🎬 二、它和 Tkinter / PyQt 的区别在哪
先说一件容易被忽略的事:Flet 写代码时,"改完控件要刷新"这条规则依然存在。
它支持声明式写法——把界面拆成可复用组件,状态一变 UI 跟着更新;但如果你走命令式(更接近传统 GUI 的写法),改完控件属性得自己调 page.update() 或 control.update():
message = ft.Text("旧内容")defchange_text(e): message.value = "新内容" page.update() # ← 少了这一行,界面不会有任何反应这一条是新手第一个坑:事件明明执行了,界面却没反应,九成是忘了 update。改多个控件就 page.update(),只改一个可以用 control.update(),拿不准就先用 page.update()。
“官方两种写法都有:声明式更适合大项目做架构,命令式上手更快。本文的示例都走命令式,因为它最接近 Python 开发者的直觉。
它能跨平台,靠的就是开头说的那套"双运行时"结构。 Tkinter 只给你桌面,PyQt 让你自己折腾打包和移动端,Kivy 的界面写法又是另一套语法。Flet 把平台范围铺得很开——桌面(Windows、macOS、Linux)、移动(iOS、Android)、浏览器(Web),界面和逻辑全部用 Python 写。
界面渲染交给 Flutter,所以窗口、动画、滚动手感是接近原生应用的观感,不是那种一眼能看出来的"脚本界面"。
“但"接近原生"和"原生"是两回事。 因为 UI 事件和状态要在 Python 与 Flutter 之间往返同步,高频刷新、复杂动画、大计算量场景下会有可感知的延迟,这是这套架构的固有代价,不是 bug,也不是版本迭代能消掉的。心里有这个预期,才不会上手后失望。
界面怎么写?Flet 的控件库有 **150+**,布局(行列、堆叠、容器、滚动视图、导航栏)、表单(输入框、下拉框、开关、滑块、日期选择)、交互(按钮、悬浮按钮、对话框、抽屉、Tab 页)都是现成的。风格上同时提供 Material 与 Cupertino 两套设计语言,一套代码适配安卓和 iOS 的观感,配色、字体、主题都能改。
还有一个容易被忽略、含金量却很高的点:NumPy、pandas、Pillow、cryptography 这些库,可以在移动端应用里直接用——Flet 官方为 iOS 和 Android 提供了预编译二进制包,你不用自己交叉编译原生依赖。翻译一下:你在电脑上验证过的数据处理逻辑,有机会原样搬进手机 App。
“注意是"有机会",不是"一定"。用到的二进制包必须在上游的预编译清单里,冷门依赖可能得自己想办法。动手前查一下官方的移动端二进制包列表。
📦 三、开发之外的事:Web、打包、测试
两条 Web 路线,按场景选:
纯前端:靠 Pyodide + WebAssembly,Python 直接在浏览器里跑,不需要 Python 服务端,部署就是扔静态文件 服务端:Python 留在服务器上,把 UI 的实时更新推给浏览器,适合要读数据库、要守密钥的场景
同一套代码,既能变成免服务器的静态站,也能变成长连接的实时应用。
打包和测试也内置在框架里:
打包:一条 flet build,出桌面可执行文件、移动安装包、Web 站点,目标包括 App Store 和 Google Play。图标、依赖、平台参数统一写在pyproject.toml里打包时可以选 Python 版本:Flet 能把 Python 3.12 / 3.13 / 3.14 之一嵌进你的应用里(默认 3.14),用 --python-version指定,或在pyproject.toml的requires-python里划范围。Web 构建会自动配对应版本的 Pyodide 运行时测试:用 pytest 写集成测试,再通过 flet test打到你打包后的真实应用上——点按钮、输文本、走完整用户流程,Android 和 iOS 还支持截图比对
框架还支持用 Python 把现有控件组合成新控件,或写扩展包装 Flutter 生态里的现成包,给应用加上新的 UI 组件和平台能力。不会的 API 也不用硬啃文档——Flet 有 MCP server,能把版本准确的 API 信息和示例、图标查找接给你的编码助手。
🛡️ 四、边界:先把该说的说清楚
工具好用,但这几点得提前知道。这一节建议你重点看,它决定你会不会用错场景。
① 性能有天花板,别拿它当"用 Python 写 Flutter"
因为 UI 状态要跨运行时同步,Flet 的性能画像和纯 Flutter 不是一回事:
启动有冷启动延迟:底层是 Flutter 引擎,即使 Hello World 也有可感知的启动时间 交互有往返开销:每次点击、输入都要走协议消息来回。表单、看板、内部工具完全够用;高频刷新(比如实时视频预览)、复杂动画就别指望了 Python 侧不好调试:Flutter DevTools 只看得见 Dart 那一半,Python 的瓶颈它不显示,排查问题时要有"两套脑子"的准备
② 富文本编辑、实时视频这类"重交互"组件,社区实测做不好
有开发者在官方讨论区反馈:原地富文本编辑器(像代码编辑器那种)和实时视频预览这两类,用 Flet 目前很难做出来。如果你正好要做这个,先评估替代方案。
③ 打包体积偏大
桌面端把 Python 运行时和 Flutter 运行时都塞进去了,打个几十兆是常态,社区实测一个 Hello World 打包后甚至能超过 100MB。做不到单文件脚本那种轻。
④ 构建环境是真实门槛
Flet 会自动处理大部分流程(缺 Flutter SDK 时首次构建自动下载,JDK 17 与 Android SDK 也由它搞定),但各平台有自己的硬前置:Windows 包要装 Visual Studio 2022/2026 并勾选「使用 C++ 的桌面开发」;iOS / macOS 包必须在 macOS 上、配 Xcode;Linux 包要装 GTK3、GStreamer、clang/llvm 一整套 交叉编译有矩阵限制: flet build apk在 Windows / macOS / Linux 上都能跑,但 iOS 和 macOS 包只能在 macOS 上出;Windows 目标也只有 Windows 能出——想在 Windows 上出 Linux 包,得走 WSL
“记住这句话:不要把「能运行」和「能打包所有平台」混为一谈。 如果你只是给同事做个 Windows 工具,先把 Windows 桌面打包跑通就够了;真需要移动端时再专门配环境。
⑤ 生态和成熟度还需要按项目评估
社区规模比 PyQt / Kivy 小,企业级大型应用的实际案例还不多。1.0 带来了正式的兼容性承诺(API 移除前先弃用、默认三个小版本窗口),稳定性比早期好得多,但长期维护仍主要靠社区活跃度。选型前建议先看看官方 issue 和你依赖的包是否齐全。
⑥ 界面风格走 Material / Cupertino
想做出完全另类的视觉,得自己写扩展包装 Flutter 组件。
⑦ 1.0 不是 0.28 的平滑升级
1.0 改成了单线程模型,老项目迁移要留意——0.28 时每个同步事件处理器跑在独立线程,阻塞代码不会冻 UI;现在都在同一个事件循环上,没挪出去的阻塞代码会让应用卡住。
⑧ 桌面端和 Web 端行为不完全一样
本地文件路径处理、浏览器权限限制、窗口大小控制、打包后的资源路径,这些在两端都可能不同。跨平台从来不是"完全不用管平台",而是"大部分代码能复用,关键点必须测"。 建议开发早期就用 --web 模式跑一跑。
🎯 五、谁适合用,谁别碰它
比较适合的场景:
Python 桌面小工具 / 内部管理工具:给同事做个数据录入、报表查看的小系统,打包成 exe 或网页都行 数据处理工具的可视化界面:手里的 Excel / 图片 / 日志批处理脚本,原来只能命令行传参,现在给它加个界面 运维脚本 GUI 化、设备调试工具:把重复的命令行操作变成可点的界面 学生课程设计、毕业设计原型:要交"带界面的程序",一套代码还能顺手演示手机端 算法 / AI 工程师:把模型包装成能点的 Demo,移动端也能现场演示 Python 教学者:入门课直接教"写出一个真能跑起来的 App",成就感比打印九九乘法表强太多
一句话概括:如果你的 Python 脚本想变得「可点、可看、可交付」,Flet 是条很顺的路。
再说该劝退的:
要做大型商业级移动 App:里面有复杂动画、深度原生能力、长期高并发用户增长——建议认真评估 Flutter 原生、React Native 或原生 Android/iOS。Flet 能做移动端,但它对 Python 开发者更友好的地方,主要还是工具型应用 需要系统级能力:托盘图标、原生菜单、传感器、蓝牙 / NFC 这类平台特有功能,开箱支持有限,得自己写扩展包 Flutter 组件 追求极致性能或极致体积:重度动画、大计算量实时应用会掉帧;想做一个"越小越好的单文件 exe",Flet 内嵌两个运行时反而是累赘——这种场景 PyInstaller打个 PyQt / Tkinter 更省事已经在用成熟的 Kivy / PyQt 项目:没有迁移的必要,除非你确实需要移动端出口
写在最后
做应用这件事,卡住大多数 Python 开发者的从来不是逻辑,而是界面和分发。
别人还在纠结 Tkinter 丑不丑、PyQt 打包报什么错、Electron 装完环境多大时,你已经用 几十行 Python 加两条命令,跑出了第一个桌面窗口。
而且这几十行,换个参数就能进浏览器,加一条 build 就能打包分发。
Flet 最大的价值,不是替代所有前端框架,也不是替代 Qt、Flutter 原生或 Electron,而是给 Python 开发者提供了一条很顺手的路径:
“Python 业务逻辑 + 现代 UI 控件 + 跨平台运行 + 相对简单的发布能力
推荐指数:⭐⭐⭐⭐☆(4.5/5,扣分在构建门槛、包体积和性能上界)
一句话评价:Python 开发者做工具型跨平台应用的一条顺路方案——它把"学前端"这件事从流程里删掉了,代价是性能上有明确的天花板、打包环境有门槛。1.0 之后,它从"值得玩"变成了"可以放心用",但前提是你的场景恰好落在它的舒适区里。
建议你今晚就用那二十行计数器代码跑一次——成本很低,跑完你就知道它适不适合你手里的活了。
📚 三分钟上手清单
“从零到跑起来,照着走一遍就行。
第一步 · 装环境
pip install 'flet[all]'Python 版本要求 3.10 以上。
第二步 · 写第一个文件
新建 counter.py,把正文里那段计数器代码粘进去,保存。
第三步 · 跑桌面版
flet run counter.py第四步 · 跑网页版
flet run --web counter.py第五步 · 准备正式项目
flet create my_app会生成带 pyproject.toml、src/、assets/、icon.png 的标准项目结构,打包所需的骨架一次就位。
第六步 · 打包分发
flet build windows按目标平台出桌面可执行文件、移动安装包或 Web 站点。
避坑提醒:
改完控件记得刷新:命令式写法不调 update(),界面不会有反应——这是新手第一坑iOS / macOS 包只能在 macOS 上出,这个绕不过去;Android 和 Web 在 Windows 上都能直接构建 移动端别用 pip freeze > requirements.txt,桌面环境的依赖会被带进去,只写直接依赖 +flet首次构建会下载 Flutter 等工具链,留够时间和磁盘 打包后的应用关闭时不会执行 atexit和收尾逻辑(Python 与 Flutter 在不同线程,正常退出会崩),要落盘的数据得在关闭前自己存好;桌面端可以用Window.prevent_close拦截关闭事件开发早期就常用 --web测一测,桌面端和 Web 端在文件访问、窗口能力上是有差异的
官方入口:官网 flet.dev | 文档 docs.flet.dev | 在线试用 Flet Studio | 社区 Discord
🧭 一条不走弯路的学习路线
Flet 入门很快,但想写得稳,还是得按顺序来。别一上来就想做完整后台管理系统,那样容易卡在控件和状态管理上:
装环境 → 计数器 → 表单提交 → 列表增删改 → 文件选择与本地保存 → 多页面和路由 → 最后再研究打包前四步基本都在桌面端或 --web 模式下就能练,打包放到最后——因为它最耗时,而且和业务逻辑关系不大。等你真有一个能跑的脚本工具了,再花时间配构建环境,性价比最高。
“本文的计数器就是第一步。如果你能把 ToDo 列表(加任务、勾选、删除、统计剩余)自己敲一遍,再加两个功能,比如「清空全部」和「保存到本地 JSON」,Flet 入门基本就通了。
拿到你的第一个 Flet 应用
① 领取资源
公众号后台回复关键词 【Flet】,自动获取我整理的「Flet 上手资源包」:
本文计数器代码 + 3 个可直接改的进阶示例(待办清单 / 数据表格 / 调用本地 API) flet build打包 Windows exe 的完整配置模板(pyproject.toml)常见报错速查表(含 Flutter SDK 环境问题)
② 往期精选
如果你喜欢这种"真上手、真踩坑"的工具实测,这几篇你可能也想看:
③ 留个问题给你
你最想用 Flet 做的第一个小工具是什么? 是给同事的数据录入界面,还是自己用的小助手?
留言告诉我,点赞最高的那个需求,我下一篇就出成品教程。
“📌 如果这篇文章帮你省下了学前端的时间,欢迎点赞、在看、转发三连支持! 📮 后续会持续更新"真上手、真踩坑"的开源工具实测,关注不迷路~