python EEL应用程序的启动过程

EEL 启动流程

  1. 初始化 EEL (eel.init()):

    • 设定静态文件目录,通常是包含 HTML、CSS、JavaScript 等文件的目录。
    • 扫描指定目录下的 JavaScript 文件,寻找通过 eel.expose() 暴露的函数。
  2. 启动 Web 服务器 (eel.start()):

    • 基于 Bottle 框架启动一个轻量级的 Web 服务器。
    • 服务器配置默认主页和静态资源的服务。
  3. 创建 WebSocket 服务:

    • 通过 Bottle 的插件或扩展来启动 WebSocket 服务。
    • WebSocket 用于支持浏览器(客户端)与 Python(服务器)之间的实时双向通信。
  4. 创建对应的 Python 函数:

    • 根据扫描到的暴露的 JavaScript 函数,动态创建 Python 中的对应函数,这些函数可用于从 Python 端调用 JavaScript 函数。
  5. 打开浏览器窗口(可选):

    • 如果配置了 EEL 以特定模式运行(如 Chrome 应用模式),EEL 可以自动打开一个浏览器窗口并加载应用。
  6. WebSocket 连接:

    • 客户端(浏览器)加载页面后,通过 EEL 的 JavaScript 部分建立 WebSocket 连接到服务器。
    • WebSocket 连接保持开启状态,等待来自客户端的调用或发送到客户端的数据。

 

  • 初始化阶段:设置基本配置,包括文件目录和 JavaScript 函数扫描,是启动过程的前提。
  • Web 服务器和 WebSocket:这两个组件是并行启动的,服务器处理静态文件请求,而 WebSocket 负责处理实时的数据交互。
  • 用户交互:一旦浏览器窗口打开,用户可以开始与应用交互,所有的前端调用都通过 WebSocket 传输到后端,并接收来自后端的响应。

为什么eel.init()之后,eel.start()之前就可以在python端通过eel.js_function_name()调用前端的js函数?并且调用的结果能在启动的界面中呈现出来,此时web服务器还未启动呢!官方文档的例子eel.say_hello_js('Python World!') 就在 eel.start('hello.html')之前。

import eel

# Set web files folder and optionally specify which file types to check for eel.expose()
#   *Default allowed_extensions are: ['.js', '.html', '.txt', '.htm', '.xhtml']
eel.init('web', allowed_extensions=['.js', '.html'])

@eel.expose                         # Expose this function to Javascript
def say_hello_py(x):
    print('Hello from %s' % x)

say_hello_py('Python World!')
eel.say_hello_js('Python World!')   # Call a Javascript function

eel.start('hello.html')             # Start (this blocks and enters loop)

这其实是EEL的排队机制在管理这些js_function调用。

EEL的队列工作机制

在 EEL 中,当你调用一个 JavaScript 函数,如 eel.say_hello_js('Python World!'),这个调用实际上并不是立即执行的。这个调用是放入一个队列中的,然后在 EEL 的 WebSocket 连接建立后才真正执行。eel.start() 函数负责启动服务器、设置 WebSocket 通信,并处理事件循环。在事件循环中,之前队列中的 JavaScript 调用会被发送到客户端执行。

这意味着,尽管 Python 代码中的调用顺序是在启动服务器之前,但 JavaScript 函数的执行仍然依赖于页面的加载和 WebSocket 连接的建立。

开发者的意图

这种设计允许开发者在代码中以一种直观的方式安排调用顺序,而无需担心实际的通信延迟。EEL 库内部处理了调用的延迟执行,确保所有事务都在正确的时间点上正确发生,即在页面准备好后。

实际应用中的注意事项

  • 阻塞与非阻塞模式eel.start() 默认是阻塞模式,它会启动一个事件循环并等待浏览器连接。如果需要在启动后执行其他 Python 代码,可以设置 block=False
  • 调用的顺序:尽管 Python 代码中看起来是先调用 eel.say_hello_js(),但这些调用只有在浏览器页面加载后才真正执行。

 

 

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

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

相关文章

2024年3月 青少年等级考试机器人理论真题四级

202403 青少年等级考试机器人理论真题四级 第 1 题 Arduino UNO/Nano主控板,通过按键开关切换高低电平,电路搭设如下,该电路属于?( ) A:外部上拉电阻电路 B:外部下拉电阻电路 C&a…

防火墙远程桌面端口号修改,通过防火墙修改远程桌面的端口号详细操作步骤

使用防火墙修改远程桌面的端口号是一项涉及系统安全和网络配置的重要任务。 以下是详细的操作步骤,旨在确保您能够安全、有效地完成此操作: 一、准备阶段 1. 了解默认端口号:远程桌面端口号通常是3389,这是一个用于远程访问和控…

五款商用加密软件推荐 | 商用加密软件排行榜

没有网络安全就没有国家安全。信息安全是国家经济社会稳定运行,广大人民群众利益的保障。 对于公司来讲,数据安全同样是企业可持续发展的重要保障,防止内部核心数据、知识产权的泄露是企业数据安全的重要工作。下面是五款企业常用的加密软件…

如何查看centos7是否安装nginx

要查看 CentOS 7 系统上是否安装了 Nginx,您可以使用多种方法来检查。以下是一些常见的方法: 通过 RPM 包管理器查询 在 CentOS 系统上,可以使用 RPM 包管理器来查询已安装的软件包。要查看是否安装了 Nginx,您可以在终端中运行以…

Spring框架概述

目录 1. Spring框架的起源 2. Spring框架的构成 3. Spring的发展历程 4. Spring的开发环境 4.1. Maven安装与配置 (1)Maven的下载与安装 (2)配置Maven的环境变量 (3)本地仓库的配置 (4…

使用Baidu Comate五分钟 , 工作时间摸鱼8小时

Baidu Comate:引领智能编码新时代 文章目录 Baidu Comate:引领智能编码新时代一、明日工具,今日领先——百度Comate智能编码助手二、万变不离其宗——适配场景需求三、功能研究3.1 指挥如指掌——指令功能3.2 助手增援——插件功能使用3.3 实…

Raft论文阅读笔记+翻译:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一种管理复制日志的共识算法。它产生与(多)Paxos等效的结果,并且与Paxos一样高效,但其结构与Paxos不同。这使得Raft比Paxos更易理解,也为构建实际系统提供…

VS2022 错误 LNK2001 无法解析的外部符号

错误 LNK2001 无法解析的外部符号 “private: static struct std::once_flag ThreadPool::flag_” (?flag_ThreadPool0Uonce_flagstdA) STL D:\VS2019\STL\源.obj 1 错误原因 :链接器无法解析 ThreadPool::flag_ 这个静态成员变量。这通常是因为静态成员变量在声明…

宁夏银川市起名专家的老师颜廷利:死神(死亡)并不可怕,可怕的是...

在中国优秀传统文化之中,汉语‘巳’字与‘四’同音,在阿拉伯数字里面,通常用‘4’来表示; 湖南长沙、四川成都、重庆、宁夏银川最靠谱最厉害的起名大师的老师颜廷利教授指出,作为汉语‘九’字,倘若是换一个…

《中国应急管理》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答: 问:《中国应急管理》杂志是核心期刊吗? 答:不是核心期刊,是正规学术期刊 问:《中国应急管理》杂志是电子版期刊吗? 答:不是,是纸质期刊 问:《…

IMDB的电影评论数据pytorh使用lstm

使用lstm对IMDB的电影评论数据进行情感分析(pytorch代码) 接下来让我们看看如何使用pytorch实现一个基于长短时记忆网络的情感分析模型。在飞桨中,不同深度学习模型的训练过程基本一致,流程如下: 数据处理&#xff1…

d17(154-168)-勇敢开始Java,咖啡拯救人生

目录 方法递归 字符集 编码-解码 IO流 字节流 字节输入流 InputSream FileInputStream 字节输出流 OutputSream FileOutputSream 释放资源的方式 try-catch-finallly try-with-resource 字符流 字符输入流 Reader FileReader 文件字符输出流 Writer FileWriter …

大数据分析案例-基于随机森林算法构建银行贷款审批预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

C#之partial关键字

在C#中,partial关键字用于声明一个类、结构体、接口或方法的分部定义。这意味着可以将一个类或其他类型的定义分成多个部分,这些部分可以在同一个命名空间或程序集中的多个源文件中进行定义。当编译器编译这些部分时,会将它们合并成一个单独的…

【RAG 论文】BGM:为 LLM 和 Retriever 的偏好 gap 搭建一个 Bridge

论文:Bridging the Preference Gap between Retrievers and LLMs ⭐⭐⭐ Google Research, arXiv:2401.06954 论文速读 LLM 与 Retriever 之间存在一个 preference gap:大多数 retriever 被设计为 human-friendly,但是 LLM 的偏好与人类的却…

网络配置的加密存储

随着数据泄露事件的增加,扰乱了公司的正常工作周期,企业遭受了损失。事实上,数据泄露可以通过存储加密来控制,存储加密是防止黑客对网络数据库造成严重破坏的最有效方法之一。在网络配置管理器中,存储加密可用于存储设…

C++数据结构——AVL树

目录 一、引言 1.1 二叉搜索树 1.2 二叉搜索树的缺陷 1.3 AVL数的引入 二、AVL树结点的定义 三、AVL树的操作 3.1 插入 3.1.1 基本步骤 3.1.2 平衡因子的调整 3.2 旋转操作(重点!) 3.2.1 右单旋 3.2.2 左单旋 3.2.3 左右双旋 3.2.4 右左双旋 3.3 插入…

【算法】滑动窗口——最小覆盖子串

本节博客是对“最小覆盖子串”题目由暴力求解到滑动窗口的思路解析,有需要借鉴即可。 目录 1.题目2.滑动窗口解法3.总结 1.题目 题目链接:LINK 这个题目是困难难度,感觉是一个中等题目的感觉。 首先我肯定想到的是暴力求解的方法&#xff…

大模型微调方法汇总

微调方法 Freeze方法P-tuning方法 prefix-tuningPrompt TuningP-tuning v1P-tuning v2Lora方法 重要相关参数LoRA 的优势Qlora方法 相关参数微调经验 模型选择模型大小选择数据处理微调方案英文模型需要做词表扩充吗?如何避免灾难遗忘大模型的幻觉问题微调后的输出…

MySQL表的增删查改【基础部分】

数据表的操作 新增 普通插入 insert into 表名 values(值,值...)注意: 此处的值要和表中的列相匹配 使用’‘单引号或者”“双引号来表示字符串 mysql> insert into student values(123,zhangsan); Query OK, 1 row affected (0.02 sec)指定列插入 insert …