当前位置: 首页 > 知识库问答 >
问题:

电子-从菜单打开文件

经兴安
2023-03-14

我的electron应用程序中有一个按钮,上面写着“打开文件”,当你点击它时,打开文件对话框就会出现,我可以选择一个文件。

但是,当我从应用程序工具栏中单击菜单项时,如何打开“打开文件对话框”?

这是工具栏菜单子菜单中的我的标签:

label: 'Open',
accelerator: 'CmdOrCtrl+O'

我想做这样的事情:

label: 'Open',
accelerator: 'CmdOrCtrl+O',
role: 'open'

但没有“开放”这样的角色。

如何实现打开打开文件对话框的单击事件?

Main.js打开文件部分:

const ipc = require('electron').ipcMain
const dialog = require('electron').dialog

ipc.on('open-file-dialog', function (event) {
  dialog.showOpenDialog({
    properties: ['openFile', 'openDirectory']
  }, function (files) {
    if (files) event.sender.send('selected-file', files)
  })
})

index.js:

const ipc = require('electron').ipcRenderer
const selectDirBtn = document.getElementById('open')

selectDirBtn.addEventListener('click', function (event) {
    ipc.send('open-file-dialog')
})

ipc.on('selected-file', function (event, path) {
    document.getElementById('selected-file').innerHTML = `► ${path}`
    document.getElementById('selected-file2').innerHTML = `${path}`
})

共有2个答案

金何平
2023-03-14

Prime:使用IPC在主进程和渲染进程之间进行通信

以下是一个例子:

// main.js 

const { app, BrowserWindow, Menu, dialog, ipcMain } = require('electron')
// wait until the app is ready before you can do anything 
app.whenReady().then(function() {
  // setting up the main window object 

  const mainWindow = new BrowserWindow({
    backgroundColor: '#FFF',
    webPreferences: {
      // devTools: true,
      nodeIntegration: true
    },
    show: false,
  })

  // setting up the menu with just two items 
  const menu = Menu.buildFromTemplate([
    {
      label: 'Menu',
      submenu: [
        {
           label:'Open File',
           accelerator: 'CmdOrCtrl+O',
           // this is the main bit hijack the click event 
           click() {
              // construct the select file dialog 
              dialog.showOpenDialog({
                properties: ['openFile']
              })
              .then(function(fileObj) {
                 // the fileObj has two props 
                 if (!fileObj.canceled) {
                   mainWindow.webContents.send('FILE_OPEN', fileObj.filePaths)
                 }
              })
  // should always handle the error yourself, later Electron release might crash if you don't 
              .catch(function(err) {
                 console.error(err)  
              })
           } 
       },
       {
           label:'Exit',
           click() {
              app.quit()
           } 
         }
      ]
    }
  ])
  Menu.setApplicationMenu(menu)
  // now run it 
  mainWindow.loadURL(`file://${__dirname}/index.html`)
  mainWindow.show()
})

不打算显示index.html您应该知道该怎么做,只需将render.js包含到超文本标记语言文档中。

现在render.js

// render.js 
const { ipcRenderer } = window.require('electron')
ipcRenderer.on('FILE_OPEN', (event, args) => {
  // here the args will be the fileObj.filePaths array 
  // do whatever you need to do with it 
  console.log('got FILE_OPEN', event, args)
})

这是在电子9上测试运行。X

张唯
2023-03-14

我有两个按钮,一个不可见的输入文件和一个可见的样式按钮。

<input type="file" id="fileId" style="display:none;" />
<button class="btn-lg btn-primary center-block" type="button"
    id="btnLoadFile">Load File</button>

在js中,我设置了样式化的按钮点击事件来触发输入文件点击事件。

document.getElementById('btnLoadFile').addEventListener("click", function(){
    document.getElementById('fileId').click();
});

然后,我有一个输入文件元素的更改事件监听器,它对文件进行一些操作。

document.getElementById('fileId').addEventListener('change', function(e){
    //use the file here
    var files = e.target.files;
    var f = files[0]; {
        var reader = new FileReader();
        var name = f.name;
        reader.onload = function (e) {
            console.log(e.target.result);
        };
        reader.readAsBinaryString(f);
    }
});

希望这能有所帮助。

 类似资料:
  • 我想我的问题以前已经回答过很多次了,但是我找不到确切的我的案例。 我有一个垂直菜单和子菜单,我想显示子菜单,只有当父菜单被点击(不是悬停),一次只显示一个子菜单,在点击菜单的某个地方后,我想要子菜单消失。 这就是我现在得到的--它基于现在的悬停。我试着把a:hover改成类似a:active的东西,但它并不能很好地工作(我在CSS方面不是很好)。 有谁知道吗?

  • 我有一个运行的电子应用程序,到目前为止工作得很好。对于上下文,我需要运行/打开一个外部文件,它是一个Go-lang二进制文件,用于执行一些后台任务。基本上,它将充当后端,并公开Electron应用程序将使用的API。 到目前为止,我所了解的是: > 我试图用"节点方式"打开文件child_process但是我可能由于路径问题而无法打开示例txt文件。 Electron API公开了一个open f

  • 我想知道当菜单按钮的菜单当前打开时,是否可以为菜单按钮设置特定样式(例如,背景色为黑色)。也就是说,如果菜单未打开,则其背景色不应为黑色。我可以在CSS文件中这样做吗?或者甚至可以这样做吗? 我知道菜单按钮有一个显示的方法,它指示我,菜单是否打开,但我不知道应用这个,以便在菜单打开时按钮颜色会发生变化。 这是菜单按钮:https://docs.oracle.com/javase/8/javafx/

  • 你好,我是新的使用硒,我试图从网页上执行一些测试。 这是我的代码: 我可以毫无问题地进入页面,我可以输入登录的用户和密码,但下一页有一个胡佛菜单,我无法使用,并停止自动执行。 这是xpath和csspath: xpath:/html/body/div[3]/div/div/form/div/ul/li[1]/ul/li[1]/a/span csspath: html body div#conten

  • 无法使用SafariDriver Selenium在Safari浏览器中打开上下文菜单。获得以下异常: org . open QA . selenium . web Driver exception:未知命令:< br> {"id":"az1mvyq9x4ly "," name":"mouseMoveTo "," parameters ":< br > { " element ":":wdc:14

  • 问题内容: 我做了以下工作; 这在Mac OS中触发,但在Windows中不触发。在Windows中还有其他事件或其他方式可以执行此操作吗? 问题答案: 这是仅Mac功能。最接近的替代方法是app.makeSingleInstance(callback)。 您可以安排使用url作为参数启动应用程序:myApp my-scheme:// stuff 然后,无论首先启动哪个应用程序进程,都使用url进