我致电dialog.showOpenDialog()
来找到文件夹的路径。但是问题在于,这不会阻止mainWindow
。有必要在显示标准路径选择GUI时,程序仅在完成路径选择后 继续工作。搜索并意识到您需要使用remote
。但是什么也没发生。
我得到:
无法解构“未定义”或“空”的属性对话框。 如果来自electronic.remote,则显示对话框。
我尝试了很多不同的事情(这些并不是全部尝试,只是我记得的事情):
const { dialog } = require ('electron').remote;
var remote = electron.remote;
var dialog = remote.dialog;
const dialog = require ('electron').remote.dialog;
我尝试了很多次连接。
我的main.js:
const url = require('url');
const path = require('path');
const {dialog} = electron.remote;
const {app, BrowserWindow, Menu} = electron;
app.on('ready', function () {
const {start_width, start_height} = electron.screen.getPrimaryDisplay().workAreaSize;
mainWindow = new BrowserWindow({
minWidth: 1250,
minHeight: 800,
height: start_height,
width: start_width,
center: true,
show: false,
});
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'templates/mainWindow.html'),
protocol: 'file:',
slashes: true
}));
mainWindow.on('closed', function () {
app.quit();
});
// mainWindow.webContents.openDevTools();
const mainMenu = Menu.buildFromTemplate(mainMenuTemplate);
Menu.setApplicationMenu(mainMenu);
mainWindow.maximize();
mainWindow.show();
});
function createAddWindow() {
addWindow = new BrowserWindow({
width: 300,
height: 200,
title: 'Add item'
});
addWindow.loadURL(url.format({
pathname: path.join(__dirname, 'templates/addWindow.html'),
protocol: 'file:',
slashes: true
}));
addWindow.on('close', function () {
addWindow = null;
})
}
const mainMenuTemplate = [
{
label: 'Analysis',
submenu: [{
label: 'Global search',
accelerator: 'Ctrl+O',
click() {
var path = createAddWindow();
console.log(path);
}
},
{
label: 'Search for a year',
accelerator: 'Ctrl+Alt+O',
click() {
console.log(folderSelect());//i need console.log (like the whole program) to continue to work after folderSelect returns some value.
}
},
{
label: 'Quit',
accelerator: process.platform == 'darwin' ? 'Command+Q' : 'Ctrl+Q',
click() {
app.quit();
}
},
]
}
];
function folderSelect() {
dialog.showOpenDialog({properties: ['openDirectory']}, function (path) {
console.log(path[0]);
if (path === undefined) {
return 'error';
}
else{
return path[0];
}
});
}
在console.log
返回一些值之后,我需要folderSelect
(像整个程序一样)才能继续工作。
例如,如果我调用了folderSelect
函数,则在选择窗口后的文件夹关闭之前,您将无法与该程序进行交互。
我在SO上看到了很多类似的问题,但是无论我什么都不做。
答案 0 :(得分:2)
为了阻止主窗口,您需要将BrowserWindow
对象作为第一个可选参数传递给dialog.showOpenDialog
方法,您要将该对话框附加到(我猜你是mainWindow
)。
引用the docs:
dialog.showOpenDialog([browserWindow,]选项)
browserWindow
参数允许对话框将自身附加到 父窗口,使其成为模式窗口。
现在,如何实现它是完全不同的事情。可以通过多种方式完成此操作,但是如果您希望从renderer
过程中调用对话框,则最简单的对话框如下所示:
import { remote } from 'electron'
remote.dialog.showOpenDialog(
remote.getCurrentWindow(), // <- notice this one
{ properties: ['openDirectory'] }
).then(result => {
// prefer promised API
})
要使整体正常工作的 关键 部分是在nodeIntegration
选项中启用BrowserWindow
,具体取决于版本的您正在使用的电子,您可能有也可能没有(它们已将version 4 中的默认值从true
切换为false
)。无论如何,最好从现在开始对其进行显式设置。因此,这通常就是现在开始mainwindow
的方式:
mainWindow = new BrowserWindow({
// ...
show: false,
webPreferences: {
nodeIntegration: true // <- this one
}
});