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.rhkb.cn/news/438884.html

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

相关文章

数据结构--二叉树的顺序实现(堆实现)

引言 在计算机科学中,二叉树是一种重要的数据结构,广泛应用于各种算法和程序设计中。本文将探讨二叉树的顺序实现,特别是堆的实现方式。 一、树 1.1树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成…

【HTML5】html5开篇基础(5)

1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…

vue-live2d看板娘集成方案设计使用教程

文章目录 前言v1.1.x版本:vue集成看板娘(暂不使用,在v1.2.x已替换)集成看板娘实现看板娘拖拽效果方案资源备份存储 当前最新调研:2024.10.2开源方案1:OhMyLive2D(推荐)开源方案2&…

【设计模式】软件设计原则——接口隔离迪米特

接口隔离原则引出 接口隔离原则 定义:用多个专门的接口,不使用单一的总接口,客户端不应该依赖它不需要的接口; 一个类对另一个类的依赖,应该建立在最小接口上;如果有一个大接口,里面有很多方法,如果使用一个类实现该接口,所有的类都要实现,导致代码冗余;…

android 全面屏最底部栏沉浸式

Activity的onCreate方法中添加 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); Android 系统 Bar 沉浸式完美兼容方案自 Android 5.0 版本,Android 带来了沉浸式系统 ba - 掘金 (juejin.cn)https://juejin.cn/post/7075578…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的,就是反馈给浏览器:这次请求是否成功,若失败,则出现失败原因 常见状态码: 200:OK,表示成功 404:Not Found,浏览器访问的资源在服务器上没有找到 403:Forbidden,访问被…

【每天学个新注解】Day 15 Lombok注解简解(十四)—@UtilityClass、@Helper

UtilityClass 生成工具类的注解 将一个类通过注解变成一个工具类,并没有什么用,本来代码中的工具类数量就极为有限,并不能达到减少重复代码的目的 1、如何使用 加在需要委托将其变为工具类的普通类上。 2、代码示例 例: Uti…

基于Java,SpringBoot,Vue智慧校园健康驿站体检论坛请假管理系统

摘要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#xf…

景区+商业,如何实现1+1>2?

景区商业,如何实现11>2? 近两年,随着旅游业的蓬勃发展,旅游热潮持续升温,游客的消费观念也在逐步升级。为了适应这一趋势,各大景区纷纷着手打造具有鲜明特色的文旅项目,希望能够吸引…

C++ | Leetcode C++题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i) {if …

cherry-markdown开源markdown组件详细使用教程

文章目录 前言开发定位目标调研技术方案前提工作量安排数据库表设计实现步骤1、引入依赖2、实现cherry-markdown的vue组件&#xff08;修改上传接口路径&#xff09;3、支持draw.io组件4、支持展示悬浮目录toc前端使用&#xff1a;编辑状态使用cherry-markdown的vue组件前端使用…

解决npm安装不了element库(目前未解决。。。)

根据您提供的错误信息&#xff0c;安装 element-plus 时出现了一些问题。这些错误主要可以分为两类&#xff1a;权限问题和网络问题。以下是一些解决这些问题的建议&#xff1a; 1. 解决权限问题 您遇到的 EPERM: operation not permitted 错误通常与文件系统权限有关。尝试以…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」&#xff1a; 下方「运动」Tab 会有一系列参数&#xff1a; 以下4个参数&#xff0c;只有「动画模式」选择「2D」才会生效&#xff0c;可忽略&#xff1a; 运动 平移 X 让镜头左右移动&#xff1a; 大于0&a…

卷积神经网络(CNN)的计算量和参数怎么准确估计?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. 卷积层&#xff08;Convolutional Layer&#xff09; a) 计算量估计&#xff1a; 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释&#xff1a; H_out, W_out&#xff…

YOLO11改进|注意力机制篇|引入HAT超分辨率重建模块

目录 一、HAttention注意力机制1.1HAttention注意力介绍1.2HAT核心代码 二、添加HAT注意力机制2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、HAttention注意力机制 1.1HAttention注意力介绍 HAT模型 通过结合卷积特征提取与多尺度注意…

推荐 uniapp 相对好用的海报生成插件

插件地址&#xff1a;自定义canvas样式海报 - DCloud 插件市场 兼容性也是不错的&#xff1a;

MySQL基础篇 - 事务

01 事务的简介 【1】什么是事务&#xff1a;事务是一组操作集合&#xff0c;要么同时操作成功&#xff0c;要么同时操作失败。 【2】对于MySQL数据库来说默认一条SQL语句就是一个事务&#xff0c;且事务是默认自动提交的。 我们可以把多条SQL语句设置成一个事务&#xff0c;使…

java:pdfbox 删除扫描版PDF中文本水印

官网下载 https://pdfbox.apache.org/download.html下载 pdfbox-app-3.0.3.jar cd D:\pdfbox 运行 java -jar pdfbox-app-3.0.3.jar java -jar pdfbox-app-3.0.3.jar Usage: pdfbox [COMMAND] [OPTIONS] Commands:debug Analyzes and inspects the internal structu…

Spring Boot技术栈:打造高效在线商城

2 相关技术 2.1 Springboot框架介绍 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring…

重学SpringBoot3-集成Redis(一)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;一&#xff09; 1. 项目初始化2. 配置 Redis3. 配置 Redis 序列化4. 操作 Redis 工具类5. 编写 REST 控制器6. 测试 API7. 总结 随…