随着Python在各个领域的广泛应用,特别是在数据科学和Web开发领域,对于一个简单易用且功能强大的用户界面(UI)开发工具的需求日益增长。传统的Python GUI库如Tkinter、PyQt虽然功能强大,但在易用性和现代感方面略显不足。近年来,一个新的跨平台UI框架——Flet,因其简洁的API和高效的开发体验而逐渐受到开发者的青睐。
Flet简介
Flet是一个用于构建跨平台应用的现代框架,它支持使用Python编写前端逻辑,同时利用Web技术(HTML/CSS/JavaScript)来呈现用户界面。这意味着开发者可以使用熟悉的Python语法来创建应用程序,并且这些应用能够在多个平台上运行,包括Windows、macOS、Linux以及移动设备。
为什么选择Flet?
易学易用:Flet的设计理念之一就是简化开发过程,其API设计直观,即使是初学者也能快速上手。
跨平台支持:不仅限于桌面应用,Flet同样适用于移动应用开发,这使得它成为一个真正的全栈解决方案。
丰富的组件库:内置了大量预定义的UI组件,覆盖了从按钮到表格等多种常见的用户界面元素。
实时预览:支持热重载功能,可以在开发过程中即时查看更改效果,极大地提高了迭代效率。
快速入门
安装Flet非常简单,只需通过pip命令即可完成:
pip install flet
简单示例:
import flet as ft
def main(page: ft.Page):
page.title = "Hello, world!"
page.add(ft.Text("Hello, world!"))
ft.app(target=main)
创建第一个Flet应用
接下来,我们来创建一个简单的Flet应用程序。以下示例展示了如何创建一个基本的Web应用,包含一个按钮和一个文本框。
import flet as ft
def main(page: ft.Page):
page.title = "我的第一个Flet应用"
# 创建文本框
text_field = ft.TextField(label="输入文本")
# 创建按钮点击事件
def button_click(e):
page.add(ft.Text(f"你输入的内容是:{text_field.value}"))
# 创建按钮
submit_button = ft.ElevatedButton(text="提交", on_click=button_click)
# 将组件添加到页面
page.add(text_field, submit_button)
ft.app(target=main)
执行:
flet app.py
文件编码转换工具示例
仅以少量的代码,即可轻松实现已带界面的实用工具。举例如下:
代码如下:
import os
import flet as ft
def convert_encoding(file_path, from_encoding='gbk', to_encoding='utf-8'):
try:
# 读取文件内容
with open(file_path, 'r', encoding=from_encoding) as f:
content = f.read()
# 写入文件内容
with open(file_path, 'w', encoding=to_encoding) as f:
f.write(content)
return f"文件 {file_path} 已从 {from_encoding} 转换为 {to_encoding}"
except Exception as e:
return f"转换 {file_path} 时出错: {e}"
def batch_convert(folder_path, from_encoding='gbk', to_encoding='utf-8'):
if not os.path.isdir(folder_path):
return f"无效的文件夹路径: {folder_path}"
results = []
for root, _, files in os.walk(folder_path):
for file in files:
if file.endswith('.txt'):
file_path = os.path.join(root, file)
result = convert_encoding(file_path, from_encoding, to_encoding)
results.append(result)
return results
def main(page: ft.Page):
page.title = "文件编码转换工具"
folder_input = ft.TextField(label="选择文件夹路径", width=400)
from_encoding_select = ft.Dropdown(label="选择源编码", options=[
ft.dropdown.Option("gbk"),
ft.dropdown.Option("utf-8"),
ft.dropdown.Option("iso-8859-1")
], value="gbk")
to_encoding_select = ft.Dropdown(label="选择目标编码", options=[
ft.dropdown.Option("utf-8"),
ft.dropdown.Option("gbk"),
ft.dropdown.Option("iso-8859-1")
], value="utf-8")
result_area = ft.Column()
def on_convert_click(e):
folder_path = folder_input.value
from_encoding = from_encoding_select.value
to_encoding = to_encoding_select.value
results = batch_convert(folder_path, from_encoding, to_encoding)
# 清空结果区域
result_area.controls.clear()
# 显示结果
for result in results:
result_area.controls.append(ft.Text(result))
page.update()
convert_button = ft.ElevatedButton(text="转换编码", on_click=on_convert_click)
# 将组件添加到页面
page.add(
folder_input,
from_encoding_select,
to_encoding_select,
convert_button,
result_area
)
ft.app(target=main)
Flet实现串口助手工具
确保已安装flet
和pyserial
,将以上代码保存到一个 Python 文件中,然后运行该文件。
pip install pyserial
import flet as ft
import serial
import serial.tools.list_ports
import threading
import time
import flet as ft
import serial
import serial.tools.list_ports
import threading
import time
class SerialAssistant:
def __init__(self):
self.serial_port = None
self.running = False
def list_ports(self):
ports = serial.tools.list_ports.comports()
return [port.device for port in ports]
def open_port(self, port, baudrate):
try:
self.serial_port = serial.Serial(port, baudrate, timeout=1)
self.running = True # 开始接收数据
return True, "串口已打开"
except Exception as e:
return False, f"打开串口时出错: {e}"
def close_port(self):
self.running = False
if self.serial_port and self.serial_port.is_open:
self.serial_port.close()
self.serial_port = None
return "串口已关闭"
return "串口未打开"
def send_data(self, data):
if self.serial_port and self.serial_port.is_open:
self.serial_port.write(data.encode('utf-8'))
return "数据已发送"
return "请先打开串口"
def read_data(self):
if self.serial_port and self.serial_port.is_open:
if self.serial_port.in_waiting > 0:
return self.serial_port.read(self.serial_port.in_waiting)
return b""
def bytes_to_hex(byte_data):
return ' '.join(f'{b:02x}' for b in byte_data)
# 列出所有可用的串口
def list_serial_ports():
ports = serial.tools.list_ports.comports()
return [port.device for port in ports]
def main(page: ft.Page):
page.title = "串口助手工具"
print("可用的串口:", list_serial_ports())
assistant = SerialAssistant()
ports = assistant.list_ports()
port_dropdown = ft.Dropdown(label="选择串口", options=[ft.dropdown.Option(port) for port in ports])
baudrate_input = ft.TextField(label="波特率", value="9600")
send_input = ft.TextField(label="发送数据")
# 将接收数据的TextField设置为多行模式
read_output = ft.TextField(label="接收数据",
multiline=True,
min_lines=6,
max_lines=10,
height=200)
# 状态栏,用于显示操作反馈
status_bar = ft.Text("状态", size=15)
def read_from_serial():
while assistant.running:
data = assistant.read_data()
if data:
try:
decoded_data = data.decode('utf-8')
read_output.value += decoded_data # 更新接收数据
except UnicodeDecodeError:
hex_data = bytes_to_hex(data)
read_output.value += f"接收到的16进制数据: {hex_data}\n" # 更新接收数据
page.update() # 更新页面显示
time.sleep(0.1) # 每100毫秒检测一次
def on_open_click(e):
port = port_dropdown.value
baudrate = int(baudrate_input.value)
success, msg = assistant.open_port(port, baudrate)
status_bar.value = msg # 更新状态栏内容
page.update() # 更新页面显示
if success:
threading.Thread(target=read_from_serial, daemon=True).start() # 启动读取线程
page.update()
def on_close_click(e):
msg = assistant.close_port()
status_bar.value = msg # 更新状态栏内容
page.update() # 更新页面显示
def on_send_click(e):
data = send_input.value
msg = assistant.send_data(data)
status_bar.value = msg # 更新状态栏内容
send_input.value = ""
page.update()
open_button = ft.ElevatedButton(text="打开串口", on_click=on_open_click)
close_button = ft.ElevatedButton(text="关闭串口", on_click=on_close_click)
send_button = ft.ElevatedButton(text="发送", on_click=on_send_click)
page.add(
port_dropdown,
baudrate_input,
open_button,
close_button,
send_input,
send_button,
read_output,
status_bar # 添加状态栏
)
ft.app(target=main)
总结
Flet作为一款新兴的Python UI框架,以其简洁的API、强大的跨平台能力和高效的开发体验赢得了众多开发者的喜爱。无论是对于想要快速搭建原型的应用开发者,还是希望深入探索Python GUI编程的初学者来说,Flet都是一个值得尝试的选择。
通过本文的介绍,希望能帮助读者对Flet有一个初步的认识,并激发起大家使用这一框架进行实践的兴趣。未来,随着社区的支持与框架本身的不断完善,相信Flet将会成为更多项目中的首选工具。
其他资源
flet - 最强Qt平替,使用Python轻松构建免费商用的跨平台应用 | flet中文网·flet最全教程·Qt最强平替
【Flet教程】使用Flet以Python创建TODO应用程序-CSDN博客
Introduction | Flet
文本 | flet中文网·flet最全教程·Qt最强平替