【Eel库】用于制作类似 Electron 的离线 HTML/JS GUI 应用程序

news/2025/1/16 13:55:35/文章来源:https://www.cnblogs.com/o-O-oO/p/18674841

简介

Eel 是一个简单的 Python 库, 用于制作类似 Electron 的离线 HTML/JS GUI 应用程序, 并可以完全访问 Python 功能和库。Eel 托管一个本地 Web 服务器, 让您可以标注 Python 中的函数, 以便从 JavaScript 调用它们, 反之亦然。Eel 旨在简化编写简短和简单的 GUI 应用程序的过程。

安装

可以通过 pip 从 pypi 安装 Eel:

pip install eel

如果需要 Jinja2 模板支持, 可以安装额外的依赖:

pip install eel[jinja2]

使用

目录结构 Eel 应用程序将分为前端(包含各种 Web 技术文件, 如 .html, .js, .css)和后端(包含各种 Python 脚本)。所有前端文件应放在单个目录中(如果需要, 可以在此目录内部further划分为文件夹)。

启动应用 假设您将所有前端文件放在一个名为 web 的目录中, 包括您的启动页 main.html, 则可以按以下方式启动应用程序:

import eel
eel.init('web')
eel.start('main.html')

这将启动一个默认设置的 Web 服务器(http://localhost:8000), 并在 Chrome 或 Chromium 浏览器中以"应用程序模式"(带有 --app 命令行标志)打开 http://localhost:8000/main.html。

应用选项 可以将其他选项作为关键字参数传递给 eel.start()。这些选项包括应用程序的模式(例如 'chrome'、'electron'、'edge'、'msie'、'custom')、服务器的主机名和端口、是否阻塞调用线程、Jinja2 模板文件夹、命令行参数、窗口大小和位置、关闭回调函数等。

暴露函数 除了前端文件夹中的文件, 还会提供一个 JavaScript 库 /eel.js。您应该在任何页面中包含这个库:

<script type="text/javascript" src="/eel.js"></script>

包含此库会创建一个 eel 对象, 可用于与 Python 端通信。使用 @eel.expose 装饰器标记的任何 Python 函数都将作为方法出现在 JavaScript 端的 eel 对象上。反之亦然, 使用 eel.expose() 公开的任何 JavaScript 函数都可以从 Python 端调用。

Hello, World! 让我们看一个简单的"Hello, World!"示例。

前端文件 web/hello.html:

<!DOCTYPE html>
<html>
<head>
<title>Hello, World!</title>
<script type="text/javascript" src="/eel.js"></script>
<script type="text/javascript">eel.expose(say_hello_js);function say_hello_js(x) {console.log("Hello from " + x);}say_hello_js("Javascript World!");eel.say_hello_py("Javascript World!");</script>
</head>
<body>Hello, World!
</body>
</html>

后端文件 hello.py:

import eeleel.init('web')@eel.expose
def say_hello_py(x):print('Hello from %s' % x)say_hello_py('Python World!')
eel.say_hello_js('Python World!')
eel.start('hello.html')

运行 Python 脚本后, 将打开一个浏览器窗口显示 hello.html, 控制台和终端中会分别显示来自 JavaScript 和 Python 的"Hello"消息。

异步 Python

Eel 基于 Bottle 和 Gevent, 提供了类似 JavaScript 的异步事件循环。为了避免 Python 标准库中的单线程假设, Gevent 会对一些模块进行"monkey patching"。通常, 您应该使用 eel.sleep() 而不是 time.sleep()。

打包分发

如果您想将应用程序打包成一个可在没有 Python 解释器的计算机上运行的程序, 可以使用 PyInstaller。配置一个包含所需 Python 版本和最小必要包的虚拟环境, 然后运行 python -m eel [your_main_script] [your_web_folder] 即可创建一个可分发的单文件应用程序。

总结

Eel 是一个轻量级的 Python 库, 可以帮助您快速开发基于 HTML/JS 的离线桌面应用程序。它提供了在 Python 和 JavaScript 之间轻松通信的功能, 同时还支持异步编程和打包分发。如果您正在寻找一种快速创建简单 GUI 应用程序的方法, Eel 绝对值得一试。

项目地址:

https://github.com/python-eel/Eel

原创 小白这样学Python

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

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

相关文章

【Java】若依(ruoyi-cloud)——14.Sentinel支持(服务熔断与降级)

若依微服务版(ruoyi-Cloud)如何实现熔断和降级? 知识前提:对Sentinel的使用有了解 若依微服务版启动 对nacos服务注册和使用有了解若依微服务版(ruoyi-cloud)中使用sentinel,进行服务熔断与降级。 环境要求和前提 JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7…

Hutool 实现非对称加密(RSA)

目录思路生成RAS密钥消息公钥加密、私钥解密代码Demo生成 A 的密钥生成 B 的密钥A 发送消息给 BB 解密 A 消息对称加密中,我们只需要一个密钥,通信双方同时持有。而非对称加密需要4个密钥。通信双方各自准备一对公钥和私钥。其中公钥是公开的,由信息接受方提供给信息发送方。…

【Node.js渗透】提取和分析 .asar 文件

#Electron 免责声明 ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!书接上回以及上上回,在了解了操作系统上基于 Electron 的应用程序的安装和识别过程后,我们将探讨提取…

大模型微调基本概念指北

本文主要分享一下大模型微调相关的基本概念,包括大模型(GPT)训练流程、微调(SFT)方法&分类&框架&最佳实践、强化学习(RLHF),最后则是分享了如何训练垂直领域大模型。本文是参考网上博客、文章后进行总结而成,旨在让刚接触大模型的同学阅读后能对大模型训练的各个…

看了一个关于linux platform的好视频

视频地址: 《嵌入式Linux platform总线驱动与设备匹配的三种方式》 https://www.bilibili.com/video/BV134CFYqEki?buvid=YC4D5AC32B076A51424FACFDDBD3BD15822A&from_spmid=tm.recommend.0.0&is_story_h5=false&mid=PbeiH8sfJs5bwGp1257AQw%3D%3D&plat_id=1…

学习 - 人工智能- 大模型的演变和训练

大模型的演变和训练 大模型训练整体上分为三个阶段: 预训练、 SFT(监督微调)以及RLHF(基于人类反馈的强化学习)一、预训练 预训练的过程类似从婴儿成长成中学生的阶段,在这个阶段我们会学习各种各样的知识,我们的语言习惯、知识体系等重要部分都会形成;对于大模型来讲,在这…

RFID基础——概念与分类

RFID 的全称是射频识别技术(Radio Frequency Identification)。是一项利用射频信号通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的的技术。这项技术在日常生活中应用广泛,例如我国的第二代身份证、门禁卡、图书标签。 RFID与NFC的区别 …

(未完工)「学习笔记」二维数点问题

0.0 前言 看了一个晚上,加上同桌的讲解,大致了解了二维数点问题的基本思路。 0.1 前置知识可持久化线段树树状数组1.0 概述 二维数点问题的一般形式是形如“给定平面上 \(n\) 个点,每次询问给定一个矩形,求该位于矩形内的点的个数”一类问题,模板题为 P2163 [SHOI2007] 园…

CentOS扩容boot分区并升级内核

本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon 前言 由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swap分区分给boot了。在此期间关于grub的操作踩了好多坑,所以特此记录一下正确操作。 使用rpm安装新内核,下载链接:htt…

陨石的秘密

题目链接: https://www.acwing.com/problem/content/319/ 题目描述提取题目大意: 构造 L1对{},L2对[],L3对() 组成的深度为D的括号序列,求方案数。 并且中括号里不能有大括号,小括号里不能有中括号和大括号。 思路:考虑“第一段”括号序列(它作为一个整体,只能是{} []…

Xorto

给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。暴力,每次找一个中点,找左右两边异或值一样的区间 #include<bits/stdc++.h> #define int long long #define TEST #define TESTS int _; cin >> _; while(_--) using…