
在使用 Eel 框架时,若 Python 函数需反向调用前端 JS 函数(如 eel.say_hello_js()),必须确保 eel.js 在自定义 JS 文件之前加载,否则 JS 函数未被注册到 eel 对象中,导致调用失败。
在使用 eel 框架时,若 python 函数需反向调用前端 js 函数(如 `eel.say_hello_js()`),必须确保 `eel.js` 在自定义 js 文件之前加载,否则 js 函数未被注册到 `eel` 对象中,导致调用失败。
Eel 实现 Python 与 JavaScript 的双向通信依赖于全局 eel 对象的正确初始化。该对象由 eel.js 注入并管理所有暴露(expose)的 JS 函数。当 Python 端调用 eel.say_hello_js("World") 时,Eel 会尝试在浏览器端查找已注册的 say_hello_js 方法——但该方法仅在 eel.expose(say_hello_js) 执行后才被挂载到 eel 对象上。而 eel.expose() 的生效前提是 eel.js 已完成加载并初始化了 eel 全局对象。
因此,关键问题在于 HTML 中 <script></script> 标签的加载顺序。原始代码中:
<script type="text/javascript" src="./script.js"></script><script type="text/javascript" src="../eel.js"></script>
会导致 script.js(含 eel.expose(say_hello_js))先执行,此时 eel 对象尚未存在,eel.expose() 调用静默失败,say_hello_js 无法注册。Python 端后续调用自然报错或无响应。
✅ 正确做法是:始终将 eel.js 放在所有自定义 JS 文件之前:
<title>Test</title><!-- ✅ eel.js 必须最先加载 --><script type="text/javascript" src="../eel.js"></script><!-- ✅ 自定义脚本在后,确保 eel 对象已就绪 --><script type="text/javascript" src="./script.js"></script><button onclick="testjs()">Test</button>
同时,JS 端需确保 eel.expose() 在 eel 可用后执行(现代 Eel 版本通常已保障,但仍建议检查控制台无 ReferenceError: eel is not defined)。完整、健壮的 JS 示例:
// script.js
// ✅ 确保在 eel.js 加载完成后执行
if (typeof eel !== 'undefined') {
eel.expose(say_hello_js);
} else {
console.error('eel.js not loaded — check script order!');
}
function say_hello_js(x) {
console.log("Hello " + x);
}
function testjs() {
console.log("testjs called");
eel.testpy(); // 触发 Python 端
}
⚠️ 注意事项:
- 不要省略
eel.js的<script></script>标签(即使使用打包工具也需显式引入); - 避免在
eel.js加载前访问eel或调用eel.expose(); - Python 端调用 JS 函数是异步的,如需处理返回值,请使用
await eel.say_hello_js("World")()(配合@eel.expose的 JS 函数返回 Promise); - 开发时开启浏览器开发者工具,检查 Console 是否出现
eel is not defined或say_hello_js is not a function提示,这是脚本顺序错误的典型信号。
遵循此加载顺序与初始化逻辑,即可稳定实现「JS → Python → JS」的闭环调用。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











