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 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.mfbz.cn/a/888563.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | SpringBoot 房屋租赁网 租房买房卖房平台(附源码)

1,绪论 1.1 背景调研 在房地产行业持续火热的当今环境下,房地产行业和互联网行业协同发展,互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能,多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

Authentication Lab | Client Side Auth

关注这个靶场的其它相关笔记:Authentication Lab —— 靶场笔记合集-CSDN博客 0x01:Client Side Auth 前情提要 有些时候,开发人员会将身份验证的逻辑写于前端,这样写是十分不安全的,因为前端的代码几乎全部都是可见的…

C#多线程基本使用和探讨

线程是并发编程的基础概念之一。在现代应用程序中,我们通常需要执行多个任务并行处理,以提高性能。C# 提供了多种并发编程工具,如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类&#xff0…

快递查询软件:实现单号识别与批量物流查询的高效工具

随着网络购物的普及,快递物流行业迎来了前所未有的发展机遇,同时也面临着巨大的挑战。跟踪物流信息成为一个难题,因此,快递查询软件的核心功能之一便是单号识别。传统的快递单号输入方式繁琐且易出错在此背景下,快递查…

代码随想录day22:回溯part4

491.递增子序列 class Solution {List<List<Integer>> result new ArrayList<>();List<Integer> path new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backTracking(nums, 0);return result;}priv…

如何基于 RLHF 来优化 ChatGPT 类型的大语言模型

&#x1f6b4;前言 对于ChatGPT来说&#xff0c;RLHF是其训练的核心。所谓RLHF&#xff0c;即Reinforcement Learning with Human Feedback&#xff0c;基于人类反馈的强化学习。这项技术通过结合模型自身的生成能力和人类专家的反馈&#xff0c;为改进文本生成质量提供了新的…

计算机网络-------重传、TCP流量控制、拥塞控制

重传、滑动窗口、流量控制、拥塞避免 重传机制 超时重传 发送方在发送数据时会启动一个定时器&#xff0c;当超过指定的时间之后&#xff0c;还没接收到接收方的ACK确认应答报文&#xff0c;就会重传该数据 快重传 当发送方收到接收方三个连续的ack之后说明发送方发送的报…

关于Amazon Linux 2023的版本及包管理器

在亚马逊上创建EC2实例时&#xff0c;会看到有一个Amazon Linux镜像。 那这个镜像与其他Linux有什么关系和区别呢&#xff1f; 网站是介绍&#xff1a;Amazon Linux 2023 是基于 Linux 的现代化通用操作系统&#xff0c;提供 5 年的长期支持。它针对 AWS 进行了优化&#xff0…

《Linux从小白到高手》理论篇:深入理解Linux的计划任务/定时任务

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的计划任务/定时计划。 Linux的计划任务 在很多时候为了自动化管理系统&#xff0c;我们都会用到计划任务&#xff0c;比如关机&#xff0c;重启&#xff0c;备份之类…

详解Java中的BIO、NIO、AIO

1、 详解Java中的BIO、AIO、NIO 1.1、引言 IO流是Java中比较难理解的一个知识点&#xff0c;但是IO流在实际的开发场景中经常会使用到&#xff0c;比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO&#xff1a;BIO、NIO以及AIO&#xff0c;重点介绍NIO。…

读数据工程之道:设计和构建健壮的数据系统03数据工程生命周期(上)

1. 数据工程生命周期 1.1. 数据领域正在经历新数据技术和实践的爆炸式增长&#xff0c;抽象程度和易用性不断提高 1.2. 由于技术抽象程度的增加&#xff0c;数据工程师将越来越多地成为数据生命周期工程师&#xff0c;根据数据生命周期管理的原则来进行思考和操作 1.3. 数据…

专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结

目录 搜索 vs 深度优先遍历 vs 深度优先搜索 vs 宽度优先遍历 vs 宽度优先搜索 vs 暴搜 1.深度优先遍历 vs 深度优先搜索(dfs) 2.宽度优先遍历 vs 宽度优先搜索(bfs) 2.关系图暴力枚举一遍所有的情况 3.拓展搜索问题全排列 决策树 1. 计算布尔⼆叉树的值&#xff08;medi…

yub‘s Algorithmic Adventures_Day7

环形链表 link&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 思路分析 我只能说双指针yyds【刻板hh】 我们分两种情况来分析 起码在第二圈才会相遇 fast比slow多走环的整数倍 fast 走的步数是 slow 步数的 2 倍&#xff0c;即 f2s&#xff…

计算机的错误计算(一百一十七)

摘要 算式“(5^25*(1/25)^(1/5)*3^25(1/25)^(1/5)*5^25*3^(251/5)-(9/25)^(1/5)*3^25*5^25-(1/25)^(1/5)*3^25*5.0^25*(13^(1/5)-3^(2/5.0)))” 的准确值是0. 但是&#xff0c;Python 与 Excel 均输出了错误结果&#xff1a;一个含有15位整数&#xff0c;一个含有14位整数。 …

Python | Leetcode Python题解之第464题我能赢吗

题目&#xff1a; 题解&#xff1a; class Solution:def canIWin(self, maxChoosableInteger: int, desiredTotal: int) -> bool:cachedef dfs(usedNumbers: int, currentTotal: int) -> bool:for i in range(maxChoosableInteger):if (usedNumbers >> i) & 1…

初学者如何快速入门人工智能

一、引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;&#xff0c;作为当今科技领域极具前景与影响力的方向之一&#xff0c;吸引着众多人士投身其中。无论是对科技充满好奇的学生&#xff0c;还是意图拓展职业发展路径的职场人士&#xff0c…

网络知识_001_浏览器输入域名

文章目录 网络模型IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;网络地址&#xff0c;广播地址&#xff0c;NAT转换浏览器输入域名到网页打开发生了什么DNS获取顺序 网络模型 模型协议工具报文添加信息作用应用层http&#xff0c;https&#xff0c;ftp&#xff0c;…

认识动态规划算法和实践(java)

前言 动态规划算法里面最有意思的一个东西之一。动态规划初学肯定会有一定晦涩难懂。如果我们去网上搜索&#xff0c;动态规划的资料&#xff0c;它一开始都是将很多的理论&#xff0c;导致会认为很难&#xff0c;但是这个东西实际上是有套路的。 动态规划的英语是Dynamic Pr…

Java爬虫技术:解锁1688商品搜索的新维度

Java爬虫技术简介 Java爬虫技术是指使用Java语言编写的程序&#xff0c;模拟浏览器行为&#xff0c;自动化地从互联网上获取信息。随着技术的发展&#xff0c;Java爬虫技术已经非常成熟&#xff0c;有多种框架和库可以使用&#xff0c;如Jsoup、HttpClient、WebMagic等。 1688…

【操作系统】引导(Boot)电脑的奇妙开机过程

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 什么是操作系统的引导&#xff1f; 操作系统的引导&#xff08;开机过程&#xff09; Windows操作系…