微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Eel-Javascript过早运行

如何解决Python Eel-Javascript过早运行

我正在尝试学习使用Python eel库。具体来说,我试图通过单击一个按钮(运行JavaScript函数)来调用Python函数

在我的文件夹中,我有四个文件,排列如下:

|
+--- main.py
|
+--- web-gui
     |
     +--- index.html
     |
     +--- main.js
     |
     +--- style.css

这是我的main.py

# Start GUI using eel

import eel

eel.init('web-gui')
eel.start('index.html',size=(1440,900),block=False)

# Boolean data from javascript (true or false) is given to python

result = eel.js_startPython()()

print('Javascript says hello! Your result is',bool(result))

这是我的main.js

// Javascript passes data to Python when button is pushed

document.getElementById("data").addEventListener("click",js_startPython);

eel.expose(js_startPython); // Expose this function to Python
function js_startPython() {
    console.log('successful button click')
    return result = true;    
}

这是我的index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Python Decider</title>
    <link rel="stylesheet" href="style.css">
    
</head>
<body>

    <div class="container">
        <div class="text">
            <h1>
                The Python Decider
            </h1>
            <p>
                Have a yes/no question? Click on the button to find out your answer.
            </p>
        </div>
        <div class="button">
            <div class="flex align-midde align-center">
                <a class="button glow-button" href="#" id="data">Click me!</a>
            </div>
        </div>
    </div>
    
    <script type="text/javascript" src="/eel.js"></script>
    <script type="text/javascript" src="main.js"></script>
    
</body>
</html>

我希望当我按下按钮时,python控制台将返回以下内容

>>> Javascript says hello! Your result is True

我当前的问题是JavaScript代码正在运行 而不被调用。不用按任何东西,它就会显示

>>> Javascript says hello! Your result is True # before button is even pressed

很抱歉,这篇文章很长。我感谢任何答案。我也很抱歉是否已经有人问过这个问题,但是我敢肯定还没有。

解决方法

您对Eel如何与JS交互的理解是错误的。目前,您的Python代码正在js_startPython()之后调用eel.start()eel.expose(js_startPython)函数将JS函数公开给Python,您要做的是使用装饰器函数@eel.expose将JS函数公开给JS:

Python

@eel.expose
def py_startJavaScript(result):
    print('Javascript says hello! Your result is',bool(result))

JavaScript

document.getElementById("data").addEventListener("click",eel.js_startPython(true));

我还注意到block=False上有eel.start(),这意味着鳗鱼将在该行之后停止。您可以通过在下面添加以下内容来避免这种情况:

while True:
    eel.sleep(10)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。