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

news2024/12/27 1:05:11

随着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实现串口助手工具

确保已安装fletpyserial,将以上代码保存到一个 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最强平替

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

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

相关文章

ZYNQ:Hello World 实验-PS-串口打印“Hello World”

Hello World 实验目的 PS-串口打印“Hello World” 创建 Vivado 工程 设置工程名为“hello_world” 使用 IP Integrator 创建 Processing System 搜索栏中键入“zynq”,找到并双击“ZYNQ7 Processing System” 串口配置 配置完成后的 ZYNQ7 Processing Sys…

微信小程序 图片的上传

错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…

【C++】 vector 迭代器失效问题

【C】 vector 迭代器失效问题 一. 迭代器失效问题分析二. 对于vector可能会导致其迭代器失效的操作有:1. 会引起其底层空间改变的操作,都有可能是迭代器失效2. 指定位置元素的删除操作--erase3. Linux下,g编译器对迭代器失效的检测并不是非常…

Python从入门到高手3.5节-程序实战之最小值算法

目录 3.5.1 算法思路 3.5.2 构造随机数 3.5.3 条件控制语句 3.5.4 完整的代码实现 3.5.5 大神薯条老师 3.5.1 算法思路 算法原理很简单,先任取两个数进行比较,以计算两个数中的最小值: 假设得到的最小值为min_,再用这两个数…

PaddleDetection 自定义训练目标检测

PaddleDetection是一个基于PaddlePaddle的目标检测端到端开发套件,在提供丰富的模型组件和测试基准的同时,注重端到端的产业落地应用,通过打造产业级特色模型|工具、建设产业应用范例等手段,帮助开发者实现数据准备、模型选型、模…

制造企业各部门如何参与生产成本控制与管理?

​国内制造业的分量可不轻,从日常生活用品到高端工业设备,中国制造几乎涵盖了各个领域。 不过很多制造业企业在管理方面确实存在一些难题:成本控制不容易,产品质量并不稳定,生产周期也常常较长。 一、中国制造业生产管…

基于SpringBoot+Vue+MySQL的考勤管理系统

系统展示 管理员界面 用户界面 系统背景 随着企业规模的扩大和管理的精细化,传统的考勤方式已经无法满足现代企业的需求。纸质签到、人工统计不仅效率低下,还容易出错。因此,开发一套基于SpringBootVueMySQL的考勤管理系统显得尤为重要。该系…

基于微信小程序医院应急设备管理系统(源码+定制+解答)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

通过ChatGPT 提示词设定60种不同的写作风格

为 ChatGPT 编写正确的提示可以对您获得的响应类型产生很大影响。 您选择的写作风格会影响答案的语气、深度和清晰度。 本指南将帮助您发现 60 多种不同的写作风格,您可以与 ChatGPT 一起使用,以获得更多个性化 ChatGPT Prompt 中的写作风格是什么? ChatGPT 提示中的写作…

html空单元格的占位

先上代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title></head><body> <H1>我的WEB页面</H1><table border"2px" bgcolor"#7fffd4&…

Docker Compose 搭建 nacos 集群

主机准备 IProle192.168.142.155slave02192.168.142.156slave192.168.142.157master192.168.142.158slave03 在 slave03 上面准备 mysql services:mysql:image: mysql:8.0.31container_name: mysqlrestart: alwaysports:- 3306:3306volumes:- /data/nacos/nacos.sql:/data/n…

vue基于Spring Boot框架的高校实验室预约管理系统

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

在java后端发送HTTPClient请求

简介 HttpClient遵循http协议的客户端编程工具包支持最新的http协议 部分依赖自动传递依赖了HttpClient的jar包 明明项目中没有引入 HttpClient 的Maven坐标&#xff0c;但是却可以直接使用HttpClient原因是&#xff1a;阿里云的sdk依赖中传递依赖了HttpClient的jar包 发送get请…

HTB:Archetype[WriteUP]

使用OpenVPN连接HTB服务器并启动靶机 靶机IP&#xff1a;10.129.95.187 分配IP&#xff1a;10.10.16.22 1.Which TCP port is hosting a database server? 使用nmap对靶机进行扫描&#xff1a;nmap -sC -sV -T4 -Pn {TARGET_IP} 通过nmap扫描结果可见&#xff1a; 1433 端口用…

C++ | Leetcode C++题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {int n nums.size();for (auto& num : nums) {int x (num - 1) % n;nums[x] n;}vector<int> ret;for (int i 0; i < n;…

有效的字母异位词【字符串哈希】

题目 题解&#xff1a; 1.排序&#xff1a; #include<algorithm>class Solution{public:bool isAnagram(string s,string t){sort(s.begin(),s.end());sort(t.begin(),t.end());return st;} } 时间复杂度O(nlogn) 2.哈希表 #include<algorithm>int hash1[100]; …

旅游推荐|旅游推荐系统|基于Springboot+VUE的旅游推荐系统设计与实现(源码+数据库+文档)

旅游推荐系统 目录 基于java的旅游推荐系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xf…

B端:常见通用模块有哪些,CRM除了通用模块,有哪些个性模块?

我经常把B端系统的功能模块分为通用模块和个性模块&#xff0c;通用模块是大部分系统都具备的功能&#xff0c;通用模块员工、日程、审批、代办等等&#xff0c;就是OA&#xff0c;通用模块生产、订单、物料、车间、设备、成本等等就是MES&#xff0c;这么说大家都晓得了吧&…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化&#xff08;Pooling&#xff09;是深度学习中常用的一种操作&#xff0c;用于降低卷积神经网络&#xff08;CNN&#xff09;或循环神经网…

Vue diff 算法介绍

首先我们来了解一下&#xff1a;diff 是什么&#xff1f; 通俗的讲&#xff0c;diff 就是比较两棵树&#xff0c;render 会生成两颗树&#xff0c;一棵新树 newVnode&#xff0c;一棵旧树 oldVnode&#xff0c;然后两棵树进行对比更新找差异就是 diff&#xff0c;全称 differe…