目录
最近在使用 Flet 进行桌面开发,整体体验相当不错。Flet 基于 Python 和 Flutter,支持跨平台运行,能够在桌面、Web 和移动端上使用同一套代码,这对于开发者而言是很大的优势。本文通过一个简单的登录界面示例,介绍 Flet 的使用方法,并总结其优缺点。
🚀 Flet 的优缺点分析
✅ 优点
- 跨平台支持:一套代码即可在 Windows、macOS、Linux、Web 和移动端运行,减少了平台兼容性问题。
- Python 生态集成:可以直接使用 Python 生态的库,如
requests、pandas、matplotlib等。 - 快速开发:Flet 提供了一套完整的 UI 组件,API 设计简单,开发效率高。
- 状态管理便捷:内置状态管理机制,简化了界面状态的同步和更新。
- 封装灵活:可以基于现有组件进行二次封装,形成更高层次的复用能力。
❌ 缺点
- 构建体积过大:即使是一个简单的“Hello World”程序,打包后的体积可能也会超过 100MB。
- 启动速度慢:由于底层是 Flutter,启动时存在一定的冷启动延迟。
- 构建速度慢:打包过程较长,构建一个可执行文件可能需要几分钟。
- 扩展性有限:虽然 Flet 提供的基础组件很丰富,但在高度自定义或复杂场景下,扩展性相对受限。
🏆 完整示例代码
以下是一个完整的登录界面示例,封装了常用组件,展示了 Flet 的基本用法。
import flet as ft
# 🔨 封装常用组件
class BaseComponents:
@staticmethod
def create_text(text, size, weight, color):
return ft.Text(text, size=size, weight=weight, color=color, font_family="微软雅黑")
@staticmethod
def create_text_field(label, width, password=False, can_reveal_password=False):
return ft.TextField(label=label, width=width, password=password, can_reveal_password=can_reveal_password)
@staticmethod
def create_button(text, on_click, width):
return ft.ElevatedButton(text=text, on_click=on_click, width=width)
@staticmethod
def create_alert_dialog(title_text):
return ft.AlertDialog(title=ft.Text(title_text))
# 🏠 页面基类
class BasePage:
def __init__(self, page):
self.page = page
self.page.window.width = 350
self.page.window.height = 300
def show(self):
self.page.clean()
self.page.add(self.build())
def build(self):
raise NotImplementedError("需在子类中实现 build 方法")
# 🔐 登录页面
class LoginPage(BasePage):
def __init__(self, page, login_callback):
super().__init__(page)
self.login_callback = login_callback
self.dlg = BaseComponents.create_alert_dialog("用户名或密码错误!")
self.username = BaseComponents.create_text_field("用户名", 300)
self.password = BaseComponents.create_text_field("密码", 300, password=True, can_reveal_password=True)
self.login_button = BaseComponents.create_button("登录", self.login_click, 300)
def login_click(self, e):
is_success, message = self.login_callback(self.username.value, self.password.value)
if is_success:
SuccessPage(self.page, message).show()
else:
self.page.open(self.dlg)
def build(self):
return ft.Column(
[self.username, self.password, self.login_button],
alignment=ft.MainAxisAlignment.CENTER,
spacing=20,
)
# ✅ 登录成功页面
class SuccessPage(BasePage):
def __init__(self, page, message):
super().__init__(page)
self.message = message
def build(self):
return ft.Text(self.message, size=20, color=ft.Colors.GREEN)
# 🔎 登录验证(模拟)
def login_check(username, password):
if username == "admin" and password == "123456":
return True, "登录成功!"
return False, "用户名或密码错误!"
# 🚀 启动程序
def main(page):
LoginPage(page, login_check).show()
if __name__ == "__main__":
ft.app(target=main)
🎯 核心思路解析
🔨 1. 基础组件封装
为了避免重复编写代码,将常用组件(如文本、输入框、按钮等)封装在 BaseComponents 类中,方便复用。
@staticmethod
def create_button(text, on_click, width):
return ft.ElevatedButton(text=text, on_click=on_click, width=width)
🌐 2. 页面基类设计
通过 BasePage 定义了一个页面基类,所有页面都继承自该类,统一窗口配置和渲染逻辑。
class BasePage:
def __init__(self, page):
self.page = page
def show(self):
self.page.clean()
self.page.add(self.build())
🔑 3. 登录逻辑实现
在 login_check 中简单模拟了登录验证逻辑,方便快速调试。
def login_check(username, password):
if username == "admin" and password == "123456":
return True, "登录成功!"
return False, "用户名或密码错误!"
🎬 效果展示

运行命令:
pip install flet
flet run
- 输入正确的用户名和密码 ➡️ 显示“登录成功”
- 输入错误的用户名或密码 ➡️ 弹出“用户名或密码错误”
💡 总结
Flet 提供了一个高效的 Python 界面开发方案,得益于其跨平台特性和 Python 的生态支持,开发效率较高。然而,较大的构建体积和较慢的启动速度在某些场景下可能成为限制。
适用场景
✅ 快速原型开发
✅ 内部管理工具
✅ 轻量级桌面或 Web 应用
不适用场景
❌ 需要高性能的客户端
❌ 需要高度定制的复杂 UI
❌ 大型商业项目
🧐 未来改进方向
- 尝试通过剥离不必要的组件,减小构建体积
- 采用增量构建,提升打包速度
- 探索更优的跨平台方案
📌 总结思考
Flet 是一个很有潜力的 Python GUI 框架,适合快速开发和小型跨平台应用。如果后续能在性能和体积方面有所优化,Flet 将会更具竞争力。

6964

被折叠的 条评论
为什么被折叠?



