python eel 多线程_利用Eel使JavaScript调用Python程序
利用Eel使JavaScript調用Python程序
Eel簡介
Eel是一個輕量的python桌面GUI開發第三方庫, 它使用HTML/JS作為界面開發語言, 但是能夠訪問所有的python功能, 類似于electron, 但是比它輕量。
Eel實際上是啟動了一個本地的web服務器, 它允許你將python的函數暴露給javascript, 所以網頁端也能調用python函數。
有很多類似于electron的python實現, 比如cefpython, 但是Eel是輕量級的, 它只是啟動了一個chrome app, 所以需要你提前安裝好chrome瀏覽器才可以, 而electron和cefpython都是封裝了網頁渲染引擎的。
安裝很簡單:
使用pip就行:
pip install eel
用法
目錄結構
Ele工程需要將前端頁面和js代碼都放在一個特定的文件夾, 其他python模塊可以放到任意可以使用的地方。類似這樣的目錄結構:
my_python_script.py
other_python_module.py
web/
main.html
css/
style.css
img/
logo.png
HelloWrold
你需要寫一個簡單的main.html頁面, 然后放到存放網頁的文件夾web, 這個文件夾內的文件都被前端訪訪問。然后寫一個簡單的app.py文件, 代碼如下:
import eel
eel.init('web')
eel.start('main.html')
最后只要在命令行運行:python app.py即可看到你的頁面。
可選參數
在調用eel.start的時候, 可以傳入一些參數, 比如設置窗口尺寸的size參數:eel.start('main.html', size=(50, 50)), 主要可以設置mode/port和啟動chrome的時候一些命令行參數, 這些命令行參數可以從這里查看 :
eel.start('main.html', port=8888)
暴露函數
為了實現高級的功能, 你必須要在前端頁面中引入下面的js模塊:
然后你可以在寫python模塊的時候, 使用裝飾器eel.expose來暴露你的python函數給JavaScript:
@eel.expose
def my_python_function(a, b):
print(a, b, a + b)
然后你在前端, 可以使用下面的js代碼來調用你的python函數:
console.log('Calling Python...');
eel.my_python_function(1, 2); // This calls the Python function that was decorated
當然你也可可以將JavaScript代碼暴露給python用:
eel.expose(my_javascript_function);
function my_javascript_function(a, b, c, d) {
if(a < b){
console.log(c * d);
}
}
然后你就可以在python中掉用JavaScript:
print('Calling Javascript...')
eel.my_javascript_function(1, 2, 3, 4) # This calls the Javascript function
完整案例
下面是我們的’main.html’文件的主要內容:
Hello, World!eel.expose(say_hello_js); // Expose this function to Python
function say_hello_js(x) {
console.log("Hello from" + x);
}
say_hello_js("Javascript World!");
eel.say_hello_py("Javascript World!"); // Call a Python function
Hello, World!
然后python模塊是:
import eel
eel.init('web') # Give folder containing web files
@eel.expose # Expose this function to Javascriptdef say_hello_py(x):
print('Hello from %s' % x)
say_hello_py('Python World!')
eel.say_hello_js('Python World!') # Call a Javascript function
eel.start('hello.html') # Start (this blocks and enters loop)
回調函數
當你調用一個被暴露的函數的時候, 我們可以傳入一個函數, 這樣就能在函數執行完畢之后立即調用這個函數。例如:
在js里定義一個函數:
eel.expose(js_random);
function js_random() {
return Math.random();
}
然后, 在python里調用的時候:
# 這是一個回調函數def print_num(n):
print('Got this from Javascript:', n)
# 在python里調用js的函數, 然后, 再傳入一個回調函數
# 回調函數將會在js函數執行完畢之后再執行eel.js_random()(print_num)
同步返回
在python端, 我們只要不使用回調函數就能同步返回:
n = eel.js_random()() # 這里有兩個括號print('Got this from Javascript:', n)
假如python里已經暴露了一個函數py_random, 在JavaScript端, 程序不允許阻塞, 所以只能使用await來避免使用回調函數:
async function run() {
// 只要函數前面帶有async, 才能在函數內部使用await
let n = await eel.py_random()(); // Must prefix call with 'await', otherwise it's the same syntax
console.log('Got this from Python:' + n);
}
run();
打包二進制文件
如果你想讓用戶下載你的軟件使用, 而用戶沒有安裝python, 你最好將你的程序打包成二進制可執行文件, 那么最好使用pyinstaller。
在你的app根目錄下執行下面的命令:
python -m eel [your_main_script] [your_web_folder]
這將創建一文件夾dist, 如果你想要創建單文件程序, 你需要使用--onefile參數, 如果不想程序運行的時候有一個黑色命令窗口, 你可以使用--noconsole參數。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的python eel 多线程_利用Eel使JavaScript调用Python程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phpstudy mysql端口_完美解
- 下一篇: iis php mysql wiki_W