#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. Теперь ваш ответ должен отображаться как принятое решение для всех, кто совершает ту же ошибку.