Почему документ не определен в электронном рендерере. js файл? - PullRequest
0 голосов
/ 17 марта 2020

Я создаю настольное приложение с помощью Electron. Я пытаюсь запустить скрипт Python, когда нажимаю кнопку (сделанную из HTML) в приложении. Я сделал это с помощью child_process и spawn. Однако, когда я запускаю npm start с командной строкой (Windows 10) в каталоге, я получаю document is not defined из renderer.js.

Я знаю, что есть что-то об использовании ipcMain и ipcRenderer в Electron, но я не уверен, как это использовать. Любая помощь приветствуется.

Вот мое дерево папок:

.
├── hello.py
├── index.html
├── main.js
├── node_modules
│       // node modules
├── package-lock.json
├── package.json
├── renderer.js
└── require.js

index.html:

<!DOCTYPE html>
<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="require.js"></script>
    <body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="require.js"></script>
        <button id="push_me" type="button">Push me</button>
    </body>
</html>

main.js:

const {app, BrowserWindow} = require('electron');
const path = require('path');
const url = require('url');
require('./renderer.js');

let win;

function createWindow() {
    win = new BrowserWindow({width: 800, height: 600, webPrefences: {nodeIntegration: true}});
    win.loadURL(url.format({
        pathname: path.join(__dirname, 'index.html'),
        protocol: 'file:',
        slashes: true
    }))

    win.on('closed', () => {
        win = null;
    })
}

app.on('ready', createWindow);
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit();
    }
})

renderer.js :

var pushMe = document.getElementById('push_me');
pushMe.addEventListener('click', runPython());

function runPython() {
    var python = require(['child_process']).spawn('python', ['hello.py']);
    python.stdout.on('data', function(data) { console.log(data.toString('utf8')); });
}

hello.py:

print("Hello, world!")

package.json:

{
  "name": "app_ui",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "electron": "^8.1.1",
    "jquery": "^3.4.1",
    "python-shell": "^1.0.8"
  }
}

1 Ответ

1 голос
/ 17 марта 2020

Вы пытаетесь получить доступ к document из основного процесса. Это не верно. Вы можете получить доступ только к DOM API внутри процессов визуализации. Я рекомендую прочитать документы , чтобы узнать различия между основными процессами и процессами визуализации.

Ваш индекс. html должен выглядеть следующим образом

<!DOCTYPE html>
<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="require.js"></script>
    <body>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script src="require.js"></script>
        <button id="push_me" type="button">Push me</button>
        <script src="renderer.js"></script> <!-- load renderer.js here -->
    </body>
</html>

, и вам следует удалить require('./renderer.js'); от основного. js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...