连接Python 3和Electron/Node.JS:构建现代桌面应用程序

目录

先决条件

第1步——设置开发环境

安装Node.js和NPM

设置Python虚拟环境

创建虚拟环境

第4步——创建Node.js应用程序

如何在Electron和Python之间进行通讯

什么是IPC?

使用child_process生成Python进程

使用python-shell

使用客户端-服务器通信

概括


先决条件

本教程专为希望使用现代Web技术、HTMLCSSJS及相关框架构建桌面应用程序和GUIPython开发人员而设计。

为了能够轻松地学习本教程,您需要具备一些先决条件:

  • 必须具备Python知识。
  • 您应该习惯使用JavaScriptHTMLCSS等网络技术。
  • 您还应该熟悉npm中的Node.js软件包的安装和使用。

1步——设置开发环境

在本节中,我们将建立一个运行示例的开发环境。我们需要在计算机上安装Node.js以及NPMPython 3

安装Node.jsNPM

您可以遵循多种方法在开发机器上安装Node.jsNPM,例如使用:

  • 目标操作系统的官方二进制文件
  • 您系统的官方软件包管理器
  • NVM(节点版本管理器),用于在同一台计算机上安装和管理Node.js的多个版本

让我们保持简单,只需访问官方网站并下载目标操作系统的二进制文件,然后按照说明在系统上安装Node.jsNPM

设置Python虚拟环境

您很有可能已经在开发计算机上安装了Python 3。如果未安装,最简单的方法是访问官方网站并获取目标系统的二进制文件。

您可以通过打开命令行界面并运行以下命令来确保在系统上安装了Python 3

$ python --version
Python 3.7.0

现在,让我们建立一个虚拟环境。

创建虚拟环境

在本节中,您将用venv创建隔离的虚拟环境以运行示例并安装所需的软件包。

虚拟环境允许您创建一个环境来隔离当前项目的依赖关系。这将使您避免具有不同版本的相同软件包之间的冲突。

Python 3中,您可以利用venv模块创建虚拟环境。

现在,转到您的终端并运行以下命令来创建虚拟环境:

$ python -m venv env

接下来,您需要使用以下命令激活环境:

$ source env/bin/activate

Windows上,您可以使用Scripts\activate.bat文件激活虚拟环境,如下所示:

$ env\Scripts\activate.bat

就是这样。现在,您已经激活了虚拟环境,并且可以为示例安装软件包。

4步——创建Node.js应用程序

现在,我们已经通过将Node.jsnpm一起安装并创建Python虚拟环境,来设置了用于PythonElectron开发的开发环境,让我们继续创建Electron应用程序。

首先,为项目创建一个文件夹,并使用以下命令在其中创建package.json文件:

$ mkdir python-nodejs-example
$ cd python-nodejs-example
$ npm init -y

Npminit命令会产生一个具有以下默认值package.json文件

{
  "name": "python-nodejs-example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

您可以自定义这个文件中您认为适合您的项目的值,您也可以简单地使用这个简单示例的默认值。

接下来,我们需要在项目的文件夹中创建两个文件index.htmlindex.js

$ touch index.js 
$ touch index.html

如何在ElectronPython之间进行通讯

在本节中,我们将看到可用于实现ElectronPython进程之间的通信的各种可用方法。

什么是IPC

根据维基百科

在计算机科学中,进程间通信(IPC)特指操作系统提供的机制,允许进程管理共享数据。通常,应用程序可以使用IPC,分类为客户机和服务器,其中客户机请求数据,服务器响应客户机请求。

IPC是指操作系统支持的一组机制,以使不同的本地或远程进程能够相互通信。例如,在我们的例子中,我们希望允许在Electron进程和Python进程之间进行通信。

让我们看一些实现IPC的方法。

使用child_process生成Python进程

Node.js提供了child_process]https://nodejs.org/api/child_process.html)模块,该模块允许您生成子进程。

让我们用它来生成一个Python进程并运行一个简单的calc.py脚本。

我们将使用simplecalculatorPython中进行简单的计算,因此我们首先运行以下命令进行安装:

$ sudo pip install simplecalculator

首先,在项目的文件夹中,创建一个py文件夹,并在其中创建一个calc.py文件:

$ mkdir py & cd py
$ touch calc.py

打开calc.py文件,并添加以下Python代码,该代码执行计算并将结果打印到标准输出中:

from sys import argv
from calculator.simple import SimpleCalculator

def calc(text):
	"""based on the input text, return the operation result"""
	try:
		c = SimpleCalculator()
		c.run(text)
		return c.log[-1]
	except Exception as e:
		print(e)
		return 0.0

if __name__ == '__main__':
    print(calc(argv[1]))

接下来,创建一个renderer.js文件,并添加以下代码以生成Python进程并执行py/calc.py脚本:

function sendToPython() {
  var python = require('child_process').spawn('python', ['./py/calc.py', input.value]);
  python.stdout.on('data', function (data) {
    console.log("Python response: ", data.toString('utf8'));
    result.textContent = data.toString('utf8');
  });

  python.stderr.on('data', (data) => {
    console.error(`stderr: ${data}`);
  });

  python.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
  });
}

btn.addEventListener('click', () => {
  sendToPython();
});

btn.dispatchEvent(new Event('click'));

接下来,打开index.html文件并按如下所示进行更新:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Calling Python from Electron!</title>
</head>

<body>
    <h1>Simple Python Calculator!</h1>
    <p>Input something like <code>1 + 1</code>.</p>
    <input id="input" value="1 + 1"></input>
    <input id="btn" type="button" value="Send to Python!"></input>
    </br>
    Got <span id="result"></span>
    
    <script src="./renderer.js"></script>

</body>
</html>

使用python-shell

在了解了如何使用child_processElectronPython之间进行通信之后,现在让我们看看如何使用python-shell

python-shell 是一个npm软件包,它提供了一种从Node.js运行Python脚本的简便方法,并具有基本且有效的进程间通信和错误处理。

您可以将python-shell用于:

  • 生成Python脚本
  • 在文本、JSON和二进制模式之间切换
  • 通过stdinstdout流进行数据传输
  • 在发生错误的情况下获取堆栈跟踪

转到终端,然后运行以下命令从npm 安装python-shell

$ npm install --save python-shell

在撰写本文时,python-shell v1.0.8已安装在我们的项目中。

接下来,打开renderer.js文件并按如下所示更新sendToPython()函数:

function sendToPython() {
  var { PythonShell } = require('python-shell');

  let options = {
    mode: 'text',
    args: [input.value]
  };

  PythonShell.run('./py/calc.py', options, function (err, results) {
    if (err) throw err;
    // results is an array consisting of messages collected during execution
    console.log('results: ', results);
    result.textContent = results[0];
  });
}

使用客户端-服务器通信

现在让我们看看使用HTTP服务器在PythonElectron之间实现通信的另一种方法。

回到终端并运行以下命令来安装FlaskFlask-Cors

$ pip install flask
$ pip install Flask-Cors

接下来,在您项目的py文件夹中,创建一个server.py文件,并添加以下代码以运行Flask服务器,该服务器仅执行计算并将结果作为HTTP响应返回:

import sys
from flask import Flask
from flask_cors import cross_origin
from calculator.simple import SimpleCalculator

def calcOp(text):
	"""based on the input text, return the operation result"""
	try:
		c = SimpleCalculator()
		c.run(text)
		return c.log[-1]
	except Exception as e:
		print(e)
		return 0.0

app = Flask(__name__)

@app.route("/<input>")
@cross_origin()
def calc(input):    
    return calcOp(input)

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5001)

接下来,打开renderer.js文件,并添加以下代码以生成Python并运行server.py文件:

let input = document.querySelector('#input')
let result = document.querySelector('#result')
let btn = document.querySelector('#btn')

function sendToPython() {
  var { PythonShell } = require('python-shell');

  let options = {
    mode: 'text'
  };
  
  PythonShell.run('./py/server.py', options, function (err, results) {
    if (err) throw err;
    // results is an array consisting of messages collected during execution
    console.log('response: ', results);
  });
}

function onclick(){

  fetch(`http://127.0.0.1:5001/${input.value}`).then((data)=>{      
      return data.text();
      
  }).then((text)=>{
    console.log("data: ", text);
    result.textContent = text;
  }).catch(e=>{
    console.log(e);
  })
}
sendToPython();

btn.addEventListener('click', () => {
  onclick();
});

btn.dispatchEvent(new Event('click'))

概括

在本教程中,我们已经为Python开发人员介绍了electronic,如果他们想使用基于HTMLCSSJavaScript的现代网络技术为自己的Python应用程序构建GUI,那么这将是一个很好的工具。我们还看到了连接Pythonelectronic的不同方法,例如child_processpython-shellHTTPFlask)服务器。

  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Electron 是一个基于 Node.js 和 Chromium 的桌面应用程序开发框架,可以使用 HTML、CSS 和 JavaScript 来构建跨平台的桌面应用程序。在本文中,我们将介绍如何使用 Python 和 Flask 结合 Electron 编写一个简单的桌面应用程序。 1. 安装 Electron 首先,我们需要安装 Electron。可以通过 npm 来安装它: ``` npm install electron --save-dev ``` 2. 创建 Electron 应用程序 接下来,我们需要创建一个基本的 Electron 应用程序。在项目根目录下创建一个名为 main.js 的文件,并添加以下代码: ``` const { app, BrowserWindow } = require('electron') const path = require('path') function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }) win.loadFile('index.html') win.webContents.openDevTools() } app.whenReady().then(() => { createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow() } }) }) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } }) ``` 这段代码创建了一个基本的窗口,加载了一个名为 index.html 的文件,并打开了开发者工具。 3. 创建 Flask 应用程序 然后,我们需要创建一个 Flask 应用程序。在项目根目录下创建一个名为 server.py 的文件,并添加以下代码: ``` from flask import Flask, jsonify app = Flask(__name__) @app.route('/api') def api(): return jsonify({'message': 'Hello, World!'}) if __name__ == '__main__': app.run(debug=True) ``` 这段代码创建了一个简单的 Flask 应用程序,具有一个名为 /api 的路由,返回了一个 JSON 响应。 4. 集成 Flask 应用程序 现在,我们需要将 Flask 应用程序集成到 Electron 应用程序中。在 main.js 文件中添加以下代码: ``` const { app, BrowserWindow } = require('electron') const path = require('path') const { spawn } = require('child_process') let flaskProcess = null const flaskPath = path.join(__dirname, 'server.py') function createWindow() { const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }) win.loadFile('index.html') win.webContents.openDevTools() } app.whenReady().then(() => { flaskProcess = spawn('python', [flaskPath]) createWindow() app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow() } }) }) app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit() } }) app.on('before-quit', () => { flaskProcess.kill() }) ``` 这段代码启动了一个 Python 进程来运行 Flask 应用程序,并在应用程序关闭之前杀死该进程。 5. 发起请求 最后,我们需要在渲染进程中发起请求。在项目根目录下创建一个名为 index.html 的文件,并添加以下代码: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello, World!</title> </head> <body> <h1 id="message"></h1> <script> const { ipcRenderer } = require('electron') ipcRenderer.on('message', (event, message) => { document.getElementById('message').textContent = message }) fetch('http://localhost:5000/api') .then(response => response.json()) .then(data => { ipcRenderer.send('message', data.message) }) .catch(error => console.error(error)) </script> </body> </html> ``` 这段代码使用 IPC 通信来从 Python 进程接收消息,并使用 fetch API 发起一个请求来获取 Flask 应用程序的响应。 6. 运行应用程序 现在,我们可以通过运行以下命令来启动应用程序: ``` npm start ``` 这将同时启动 Electron 应用程序和 Flask 应用程序,并打开一个窗口,显示来自 Flask 应用程序的消息。 至此,我们已经成功地构建了一个使用 Python、Flask 和 Electron 框架的桌面应用程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值