Flet介绍:平替PyQt的好用跨平台Python UI框架

随着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 ftdef main(page: ft.Page):page.title = "Hello, world!"page.add(ft.Text("Hello, world!"))ft.app(target=main)

创建第一个Flet应用

接下来,我们来创建一个简单的Flet应用程序。以下示例展示了如何创建一个基本的Web应用,包含一个按钮和一个文本框。

import flet as ftdef 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 ftdef 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 resultsdef 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.valuefrom_encoding = from_encoding_select.valueto_encoding = to_encoding_select.valueresults = 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实现串口助手工具

确保已安装fletpyserial,将以上代码保存到一个 Python 文件中,然后运行该文件。

pip install pyserial

import flet as ft
import serial
import serial.tools.list_ports
import threading
import timeimport flet as ft
import serial
import serial.tools.list_ports
import threading
import timeclass SerialAssistant:def __init__(self):self.serial_port = Noneself.running = Falsedef 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 = Falseif self.serial_port and self.serial_port.is_open:self.serial_port.close()self.serial_port = Nonereturn "串口已关闭"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.valuebaudrate = 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.valuemsg = 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最强平替

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法篇1:双指针思想的运用(1)--C++

一.算法解析 双指针,顾名思义就是两个指针,常见的算法中,我们可以看到两种: 1.对撞指针:一般用于顺序结构,也称为左右指针。 对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端…

比较搜索难度曲线5s1-4和4s1

在行列可自由变换的条件下,平面上的5点结构只有34个,4点结构有16个 (A,B)---6*n*2---(0,1)(1,0) 让B全是0。当收敛误差为7e-4,收敛199次取迭代次数平均值。让隐藏层节点数n分别为10,15,20,25,30&#xff…

C(十四)while、for、do-while循环综合(一)

uu们,小弟我本科在读,文章我会一直坚持更新下去,包括但不限于C初阶、C进阶、数据结构、C、Linux、MySQL、项目、QT开发、各种算法(之后会持续更新),并且站在小白的视角尽可能通俗易懂地把这些写出来&#x…

【Android】获取备案所需的公钥以及签名MD5值

目录 重要前提 获取签名MD5值 获取公钥 重要前提 生成jks文件以及gradle配置应用该文件。具体步骤请参考我这篇文章:【Android】配置Gradle打包apk的环境_generate signed bundle or apk-CSDN博客 你只需要从头看到该文章的配置build.gradle(app&…

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合,这是因为工科要求都必须是8开头的专业课,里面参考课本还是没变的,无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app

uniapp一个很是用的功能,就是在我们发布新版本的app后,需要提示用户进行app更新,并告知用户我们新版的app更新信息,以使得用户能及时使用上我们新开发的功能,提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说,project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具,使用venv可以为每个项目创建一个独立的环境:python -m venv myprojectenv (项目名后e…

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

ROS同步解包 引言1 鱼香ROS一键安装ros-docker脚本:2 指定目录映射3 数据解包3.1 解包脚本3.2 依赖安装3.3 运行脚本,解包 引言 总结步骤如下: 采集同步数据:ROS录制(推荐),或者代码同步触发采…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今,iOS 用户现在可以毫不费力地删除背景,而无需复杂的应用程序。在这篇文章中,您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

通信工程学习:什么是IP网际协议

IP:网际协议 IP网际协议(Internet Protocol,简称IP)是整个TCP/IP协议栈中的核心协议之一,它负责在网络中传送数据包,并提供寻址和路由功能。以下是对IP网际协议的详细解释: 一、对IP网际协议的…

哈尔滨自闭症学校寄宿条件与优势解析

自闭症儿童的希望之光:广州星贝育园寄宿制学校深度解析 在当今社会,自闭症儿童作为一群需要特别关注和照顾的群体,其教育与康复问题日益受到社会各界的重视。自闭症儿童不仅需要专业的康复训练,还需要一个稳定、温馨且充满爱的环…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式,用于定义一种语言的文法,并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类,使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

关于Generator,async 和 await的介绍

在本篇文章中我们主要围绕下面几个问题来介绍async 和await 🍰Generator的作用,async 及 await 的特点,它们的优点和缺点分别是什么?await 原理是什么? 📅我的感受是我们先来了解Generator,在去…

【AI学习】Mamba学习(二):线性注意力

上一篇《Mamba学习(一):总体架构》提到,Transformer 模型的主要缺点是:自注意力机制的计算量会随着上下文长度的增加呈平方级增长。所以,许多次二次时间架构(指一个函数或算法的增长速度小于二次…

linux下yum安装时出现Loaded plugins: fastestmirror的解决办法

一、centos7修改源 在CentOS 7中,修改系统软件源可以通过编辑/etc/yum.repos.d/目录下的.repo文件来实现。以下是一个基本的步骤和示例代码,用于将默认的软件源修改为阿里云的源。 备份当前的CentOS-Base.repo文件: sudo cp /etc/yum.repos.…

PD协议芯片ECP5701+充电管理芯片+升压芯片搭配应用TYPE-C口充电及升压供电系统

以往的电子设备需要有专门的电源适配器来供电,不仅需要大家区分不同设备的充电器,还要专门找地方来放置,还给用户带来了诸多不便。然而,TYPE-C接口,全称USB Type-C,迅速取代了传统的USB接口,成为…

[linux 驱动]input输入子系统详解与实战

目录 1 描述 2 结构体 2.1 input_class 2.2 input_dev 2.4 input_event 2.4 input_dev_type 3 input接口 3.1 input_allocate_device 3.2 input_free_device 3.3 input_register_device 3.4 input_unregister_device 3.5 input_event 3.6 input_sync 3.7 input_se…