通过Eel从Python调用JavaScript函数失败,报AttributeError错误
问题分析与解决
你遇到的AttributeError: module 'eel' has no attribute 'say_hello_js'并非版本兼容问题,核心原因是Python代码在网页未完成加载时就尝试调用JS函数。
Eel的工作逻辑是:JS函数通过eel.expose()暴露给Python的前提是网页已经完成初始化并加载了eel.js,而你原代码中在eel.start()之前就调用eel.say_hello_js(),此时网页还未启动,Eel还未注册该JS函数,自然会抛出属性不存在的错误。
修复方案
方案1:使用eel.start()的回调函数
将调用JS函数的逻辑放到页面启动完成后的回调里,确保网页已加载:
import eel # Set web files folder eel.init('web') @eel.expose # Expose this function to Javascript def say_hello_py(x): print('Hello from %s' % x) say_hello_py('Python World!') def on_page_started(): # 页面加载完成后调用JS函数 eel.say_hello_js('Python World!') eel.start('hello.html', size=(300, 200), callback=on_page_started) # Start
方案2:非阻塞启动后延迟调用
如果需要在启动后执行额外逻辑,可以用block=False让eel.start()不阻塞,延迟一段时间后再调用JS函数:
import eel import time eel.init('web') @eel.expose def say_hello_py(x): print('Hello from %s' % x) say_hello_py('Python World!') # 非阻塞启动页面 eel.start('hello.html', size=(300, 200), block=False) # 给页面加载留足够时间(根据实际情况调整) time.sleep(1) # 调用JS函数 eel.say_hello_js('Python World!') # 保持程序运行 while True: eel.sleep(1)
验证兼容性
Python 3.8.10与最新版本的Eel完全兼容,你遇到的问题和版本无关,只需调整代码执行时机即可解决。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

