Ich versuche, eine plattformübergreifende Desktop-App mit Webtechnologien (HTML5, CSS und JS) zu schreiben. Ich habe mir einige Frameworks angesehen und mich für das Electron-Framework entschieden.

Ich habe die App bereits in Python erstellt und möchte wissen, ob es möglich ist, plattformübergreifende Desktopanwendungen mit Python im Electron-Framework zu schreiben.

51
A Junior 22 Aug. 2015 im 20:12

3 Antworten

Beste Antwort

Es ist möglich, mit Electron zu arbeiten. Wenn Sie jedoch nach "Webbish" -UI-Funktionen suchen, können Sie Flexx überprüfen - Sie können in reinem Python codieren und dennoch das Styling und die Flexibilität der Benutzeroberfläche von Webentwicklungstools nutzen.

Wenn Sie darauf bestehen, auf Electron zu gehen, sollten Sie der Idee dieses post.

Stellen Sie zunächst sicher, dass Sie alles installiert haben:

pip install Flask
npm install electron-prebuilt -
npm install request-promise -g

Erstellen Sie nun das Verzeichnis, in dem die ganze Magie geschehen soll, und fügen Sie die folgenden Dateien hinzu

Erstellen Sie Ihre 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)

Erstellen Sie Ihr grundlegendes package.json:

{
  "name"    : "your-app",
  "version" : "0.1.0",
  "main"    : "main.js",
  "dependencies": {
    "request-promise": "*",
    "electron-prebuilt": "*"
  }
}

Erstellen Sie zum Schluss Ihr 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();
});

Aus dem Beitrag selbst entnommen - sind die folgenden Hinweise

Beachten Sie, dass wir in main.js einen untergeordneten Prozess für eine Python-Anwendung erzeugen. Dann prüfen wir, ob der Server in Betrieb war oder nicht, und verwenden eine unbegrenzte Schleife (naja, schlechte Praxis! Wir sollten tatsächlich die erforderliche Zeit überprüfen und die Schleife nach einigen Sekunden unterbrechen). Nachdem der Server hochgefahren ist, erstellen wir ein tatsächliches Elektronenfenster, das auf die neue Indexseite der lokalen Website verweist.

31
kas 29 Jän. 2017 im 02:44

Sie können die Python-Shell verwenden, um zwischen Python und Node.js / Electron zu kommunizieren.

Die Python-Shell bietet eine einfache Möglichkeit, Python-Skripte von Node.js mit grundlegender und effizienter Kommunikation zwischen Prozessen und besserer Fehlerbehandlung auszuführen.

Mit Python-Shell können Sie:

  • Python-Skripte in einem untergeordneten Prozess erzeugen;
  • Umschalten zwischen Text-, JSON- und Binärmodus;
  • Verwenden Sie benutzerdefinierte Parser und Formatierer.
  • Datenübertragungen über stdin- und stdout-Streams durchführen;
  • Abrufen von Stack-Traces, wenn ein Fehler ausgelöst wird.

Stellen Sie in Ihrem Terminal sicher, dass Sie sich im Stammordner Ihres Projekts befinden, und führen Sie den folgenden Befehl aus, um die Python-Shell von npm aus zu installieren:

npm install --save python-shell 

Sie können dann einfach eine Python-Shell ausführen, indem Sie:

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);
});

Weitere Informationen finden Sie in diesem Tutorial

2
Ahmed Bouchefra 21 Dez. 2018 im 11:19

Dies ist ein Update der Antwort von @bluesummers, das am 2. Januar 2020 für mich funktioniert.

  1. Installieren Sie Node (https://nodejs.org/en/download/) und Python 3.

  2. Abhängigkeiten installieren:

    pip install Flask
    npm install electron
    npm install request
    npm install request-promise
  1. Erstellen Sie ein Verzeichnis für Ihr Projekt und erstellen Sie die folgenden Dateien in diesem Verzeichnis:

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 )
  1. Führen Sie im Projektverzeichnis Folgendes aus:
    npm start
0
M Katz 2 Jän. 2020 im 20:44