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