我正在尝试使用网络技术(HTML5、CSS 和 JS)编写跨平台桌面应用程序。我看了一些框架并决定使用 Electron 框架。
我已经用 Python 完成了应用程序,所以我想知道是否可以在 Electron 框架上使用 Python 编写跨平台桌面应用程序?
可以使用 Electron,但如果您正在寻找“webbish”UI 功能,您可以查看 Flexx - 它允许您使用纯 Python 进行编码,但仍然使用 Web 开发工具的样式和 UI 灵活性。
如果你坚持使用 Electron,你应该遵循这个post.
的想法首先确保你已经安装了所有的东西:
pip install Flask
npm install electron-prebuilt -
npm install request-promise -g
现在创建您希望所有魔法发生的目录并包含以下文件
创建你的
hello.py
:
from __future__ import print_function
import time
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World! This is powered by Python backend."
if __name__ == "__main__":
print('oh hello')
#time.sleep(5)
app.run(host='127.0.0.1', port=5000)
创建您的基本
package.json
:
{
"name" : "your-app",
"version" : "0.1.0",
"main" : "main.js",
"dependencies": {
"request-promise": "*",
"electron-prebuilt": "*"
}
}
最后创建你的
main.js
:
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
electron.crashReporter.start();
var mainWindow = null;
app.on('window-all-closed', function() {
//if (process.platform != 'darwin') {
app.quit();
//}
});
app.on('ready', function() {
// call python?
var subpy = require('child_process').spawn('python', ['./hello.py']);
//var subpy = require('child_process').spawn('./dist/hello.exe');
var rq = require('request-promise');
var mainAddr = 'http://localhost:5000';
var openWindow = function(){
mainWindow = new BrowserWindow({width: 800, height: 600});
// mainWindow.loadURL('file://' + __dirname + '/index.html');
mainWindow.loadURL('http://localhost:5000');
mainWindow.webContents.openDevTools();
mainWindow.on('closed', function() {
mainWindow = null;
subpy.kill('SIGINT');
});
};
var startUp = function(){
rq(mainAddr)
.then(function(htmlString){
console.log('server started!');
openWindow();
})
.catch(function(err){
//console.log('waiting for the server start...');
startUp();
});
};
// fire!
startUp();
});
取自帖子本身 - 以下是注释
注意在 main.js 中,我们为 Python 应用程序生成了一个子进程。然后我们使用无限循环检查服务器是否已启动(好吧,糟糕的做法!我们实际上应该检查所需的时间并在几秒钟后中断循环)。服务器启动后,我们建立一个实际的电子窗口,指向新的本地网站索引页面。
这是对@bluesummers 在 2020 年 1 月 2 日对我有用的答案的更新。
安装 Node (https://nodejs.org/en/download/) 和 python 3.
安装依赖项:
pip install Flask
npm install electron
npm install request
npm install request-promise
main.js
const electron = require( "electron" );
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
electron.crashReporter.start( { companyName: "my company", submitURL: "https://mycompany.com" } );
var mainWindow = null;
app.on(
"window-all-closed",
function()
{
// if ( process.platform != "darwin" )
{
app.quit();
}
}
);
app.on(
"ready",
function()
{
var subpy = require( "child_process" ).spawn( "python", [ "./hello.py" ] );
// var subpy = require( "child_process" ).spawn( "./dist/hello.exe" );
var rp = require( "request-promise" );
var mainAddr = "http://localhost:5000";
var OpenWindow = function()
{
mainWindow = new BrowserWindow( { width: 800, height: 600 } );
// mainWindow.loadURL( "file://" + __dirname + "/index.html" );
mainWindow.loadURL( "http://localhost:5000" );
mainWindow.webContents.openDevTools();
mainWindow.on(
"closed",
function()
{
mainWindow = null;
subpy.kill( "SIGINT" );
}
);
};
var StartUp = function()
{
rp( mainAddr )
.then(
function( htmlString )
{
console.log( "server started!" );
OpenWindow();
}
)
.catch(
function( err )
{
console.log( "waiting for the server start..." );
// without tail call optimization this is a potential stack overflow
StartUp();
}
);
};
// fire!
StartUp();
});
package.json
{
"name": "your-app",
"version": "0.1.0",
"main": "main.js",
"scripts":
{
"start": "electron ."
},
"dependencies":
{
"electron": "*",
"request": "^2.88.0",
"request-promise": "^4.2.5"
}
}
hello.py
from __future__ import print_function
# import time
from flask import Flask
app = Flask( __name__ )
@app.route( "/" )
def hello():
return "Hello World! This is powered by a Python backend."
if __name__ == "__main__":
print( "oh hello" )
#time.sleep(5)
app.run( host = "127.0.0.1", port = 5000 )
npm start
您可以使用 python-shell 在 Python 和 Node.js/Electron 之间进行通信。
python-shell 提供了一种从 Node.js 运行 Python 脚本的简单方法,具有基本且高效的进程间通信和更好的错误处理。
使用python-shell,你可以:
在您的终端中,确保您位于项目的根文件夹中,并运行以下命令从 npm 安装 python-shell:
npm install --save python-shell
然后您可以使用以下命令简单地运行 Python shell:
var pyshell = require('python-shell');
pyshell.run('hello.py', function (err, results) {
if (err) throw err;
console.log('hello.py finished.');
console.log('results', results);
});
从这个教程中查看更多信息
使用我正在开发的 electron-django 应用程序我使用 pyinstaller 来编译我的 django 应用程序,然后只生成它的子进程并且它可以工作,请注意 pyinstaller 可能无法识别所有模块或 dist 文件夹。网上有很多关于如何获得填充 .specs 文件和修改 dist 文件夹以添加您可能需要的文件的解决方法的示例。 pyinstaller 通常会告诉你终端出了什么问题。希望有帮助
现在有一种方法可以将 Streamlit(Python)应用程序转换为 Electron:https://github.com/whitphx/stlite/blob/main/packages/desktop-cli/README.md
注意,您使用的所有包都需要有 Python 3 wheels 可用于 micropip 来构建您的应用程序
我们刚刚发布了NiceGUI 1.2.0,它引入了“原生”模式。这允许通过在桌面上打开本机窗口而不是浏览器选项卡来实现类似 Electron 的功能。
NiceGUI 是一个开源 Python 库,用于编写在浏览器中运行的图形用户界面。它的学习曲线非常平缓,同时仍提供高级定制选项。 NiceGUI 遵循后端优先的理念:它为您处理所有 Web 开发细节。您可以专注于编写 Python 代码。
python3 -m pip install nicegui
from nicegui import ui
ui.label('This is a Python desktop app')
ui.button('click me', on_click=lambda: ui.notify('a notification'))
ui.run(native=True)
当然app也可以打包成可执行文件.