Python Eel — преждевременный запуск Javascript

#javascript #python #eel

#javascript #python #eel

Вопрос:

Я пытаюсь научиться использовать библиотеку Python eel. В частности, я пытаюсь вызвать функцию Python, нажав кнопку (которая запускает функцию JavaScript).

В моей папке у меня есть четыре файла, расположенных следующим образом:

 |
 --- 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
  

Извините за действительно длинный пост. Я ценю любые ответы. Я также прошу прощения, если этот вопрос уже задавался на SO, но я почти уверен, что этого не было.

Ответ №1:

Ваше понимание того, как Eel взаимодействует с JS, неверно. В настоящее время ваш код Python вызывает js_startPython() after eel.start() . eel.expose(js_startPython) Функция предоставляет функцию JS для Python, то, что вы хотите сделать, это предоставить функцию Python для вашего JS, используя функции декоратора @eel.expose :

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() , что означает, что eel остановится после этой строки. Вы можете избежать этого, добавив следующее ниже:

 while True:
    eel.sleep(10)
  

Комментарии:

1. Спасибо, что указали на это. Я тоже понял это через некоторое время и заставил его работать, но я не обновлял вопрос по SO. Теперь ваш ответ должен отображаться как принятое решение для всех, кто совершает ту же ошибку.