18
loading...
This website collects cookies to deliver better user experience
pip3 install eel
, as well as installing Chrome if you somehow didn't do that yet, let's write main.py
:#!/usr/bin/env python3
import eel
counter = 0
@eel.expose
def change_counter(num):
global counter
counter += num
if counter >= 10:
eel.display_message("slow down!")
return counter
eel.init("web")
eel.start("index.html")
web
directory, and open new window in Chrome, serving index.html
from it.@eel.expose
.eel.display_message
, which we'll define later./eel.js
is provided by Eel. app.js
is our code.<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Counter: <span id="count">0</span></h1>
<button id="plus">+1</button>
<button id="minus">-1</button>
<div id="message"></div>
<script type="text/javascript" src="/eel.js"></script>
<script type="text/javascript" src="app.js"></script>
</body>
</html>
let countSpan = document.querySelector("#count")
document.querySelector("#plus").addEventListener("click", async () => {
let result = await eel.change_counter(1)()
countSpan.textContent = result
})
document.querySelector("#minus").addEventListener("click", async () => {
let result = await eel.change_counter(-1)()
countSpan.textContent = result
})
eel.expose(display_message)
function display_message(message) {
document.querySelector("#message").textContent = message
}
eel.change_counter
on the backend. It's not clear to me why, but to get return value we need to do the weird double-call with await eel.change_counter(1)()
. I'm not sure why Eel calls don't just return a promise without extra steps, but there's probably some reason for it.display_message
function, and expose it to the backend with eel.expose
. JavaScript doesn't have function decorators, but this fake decorator works due to function hoisting.