Узел интеграции не работает в электронном? - PullRequest
0 голосов
/ 21 июня 2019

Я создаю приложение для инвентаризации с бэкэндом, написанным на Python 3.7.Я использую Electron для создания графического интерфейса для него и модуля "python-shell" модуля Node.js для связи с кодом Python.Я хотел бы, чтобы весь код для python-shell находился в отдельном файле JavaScript (connector.js).Если я запускаю только этот файл с узлом из командной строки, он работает отлично, но вызов функции из кнопки HTML не работает.

Я знаю, что с одним из последних обновлений Electron nodeIntegration по умолчаниюложно, но я установил это на истину.К сожалению, это все еще не позволяет мне общаться с модулем Node в процессе рендеринга Electron.Если я скопирую код соединителя.js в файл main.js, используемый Electron, и вызову его при запуске приложения, он работает, но вызов его с помощью кнопки HTML также явно не работает.

Этоэто файл main.js для Electron, для которого для nodeIntegration задано значение true.


const {app, BrowserWindow, Menu} = require('electron')
const fs = require('fs')

let mainWindow

function createWindow() {
    mainWindow = new BrowserWindow({
        // Set fixed size of main window
        width: 1280,
        height: 768,
        resizable: false,
        webPrefrences: {
            nodeIntegration: true,
        }
    })

    mainWindow.loadFile('./main.html')

    mainWindow.on('closed', function () {
        mainWindow = null
    })

    //Opens the dev tools by default.
    mainWindow.webContents.openDevTools();
}

// Disable the default Menu Bar
Menu.setApplicationMenu(null)

app.on('ready', createWindow)

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

app.on('activate', function () {
    if (mainWindow === null) createWindow()
})

И это файл connector.js, который вызывает скрипт Python с правильными аргументами.functions.py предназначен для тестирования очень простого скрипта, который принимает первый аргумент командной строки (в данном случае addNewDataset) для вызова функции, а второй - в качестве имени создаваемого файла.


const {PythonShell} = require('python-shell')

var options = {
    mode: 'text',
    encoding: 'utf8',
    pythonPath: 'python3',
    pythonOptions: ['-u'],
    scriptPath: './',
    args: ['addNewDataset', 'testDataset123']
};

function test() {
    PythonShell.run('functionality.py', options, function (err) {
        if (err) throw err;
        console.log('done');
    });
}

Itзагружается в файл HTML с помощью простого тега сценария

<script src="connector.js"></script>

и вызывается с использованием ввода

<input type="submit" value="Button" onclick="test()">

Я совершенно уверен, что просто неправильно понимаю, как Электрон и основной ирендерер обрабатывает работу.К сожалению, независимо от того, что я ищу в Интернете, я не могу найти решение, которое действительно работает.

1 Ответ

0 голосов
/ 23 июня 2019

Добавьте module.exports в ваш файл Python. Это будет выглядеть так:

module.exports = {
    test: function () {
        PythonShell.run('functionality.py', options, function (err) {
            if (err) throw err;
            console.log('done');
        });
    }
}

Приведенный выше код предоставит вашу функцию, когда вам потребуется html-файл в качестве переменной. Вот так в HTML-файле:

<HTML>
<input id="SpecialButton" type="submit" value="Button" onclick="test()">
<!-- ^add an id to the button -->

<script>

    const python = require('python-file-path')

    document.getElementById('SpecialButton').onclick = () => {
        python.test() //call the function of the python file like this
    }

</script>
</HTML>

Я не тестировал свой код в IDE, поэтому прошу прощения за любые синтаксические ошибки.


Подробнее об экспорте функций в модули: Как в Node.js «включать» функции из других моих файлов?

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