Escher-js / SkimmedMilk

0 stars 0 forks source link

read file #8

Closed psmuler closed 1 year ago

psmuler commented 1 year ago

画面に"File"と書かれたボタンを用意し、押されたらローカルから読み込むファイルを選択するためのポップアップを表示しましょう。

psmuler commented 1 year ago

Electronアプリで「File」と書かれたボタンを作成し、クリックするとファイルを選択するためのポップアップが表示されるようにするには、以下の手順を実行してください。

  1. index.htmlファイルにボタンを追加:

index.htmlファイルに、"File"というテキストが表示されたボタンを追加します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>My Electron App</title>
  </head>
  <body>
    <h1>Hello, Electron!</h1>
    <button id="file-btn">File</button>

    <script src="renderer.js"></script>
  </body>
</html>
  1. renderer.jsファイルの作成:

プロジェクトルートにrenderer.jsというファイルを作成し、以下のコードを追加します。このファイルでは、ボタンがクリックされたときのイベントリスナーを定義します。

const { ipcRenderer } = require('electron');

const fileBtn = document.getElementById('file-btn');

fileBtn.addEventListener('click', () => {
  ipcRenderer.send('open-file-dialog');
});
  1. main.jsファイルの更新:

main.jsファイルに、ipcMainを使用して、renderer.jsからのメッセージを受信し、ファイルダイアログを開くコードを追加します。

const { app, BrowserWindow, ipcMain, dialog } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true
    },
  });

  win.loadFile('index.html');
}

app.whenReady().then(createWindow);

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

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});

ipcMain.on('open-file-dialog', (event) => {
  const options = {
    title: 'Select a file',
    properties: ['openFile'],
  };

  dialog.showOpenDialog(null, options).then((result) => {
    if (!result.canceled) {
      console.log('Selected file:', result.filePaths[0]);
    }
  });
});
  1. アプリの実行:

以下のコマンドでElectronアプリを起動します。

npm start

これで、「File」と書かれたボタンが表示され、クリックするとファイル選択ポップアップが表示されるようになります。選択したファイルのパスは、main.js内のconsole.logで表示されます。

psmuler commented 1 year ago

fileボタンを押しても何も起きません。

psmuler commented 1 year ago

すみません、問題があるかもしれません。まず、以下のデバッグ手順を実行して、問題の原因を特定しましょう。

  1. 開発者ツールを開く:

アプリのウィンドウで、Ctrl+Shift+I(Windows/Linux)またはCmd+Opt+I(Mac)を押して開発者ツールを開きます。

  1. Consoleタブを確認:

Consoleタブでエラーが表示されているか確認します。エラーがある場合、それを解決する必要があります。

  1. renderer.jsのコードを確認:

renderer.jsファイルがindex.htmlで正しく読み込まれていることを確認します。renderer.jsファイルが正しく配置されているか、またはindex.htmlでの<script>タグが正しいかどうかを確認してください。

  1. イベントリスナーの確認:

renderer.jsファイル内で、イベントリスナーが正しく定義されていることを確認します。clickイベントが正しく設定されているかどうかをチェックしてください。

  1. main.jsファイルのコードを確認:

main.jsファイル内で、ipcMainおよびdialogの定義が正しいことを確認します。また、ipcMain.on('open-file-dialog', ...)のイベントリスナーが正しく設定されていることも確認してください。

これらの手順を実行しても問題が解決しない場合は、お手数ですが、エラーメッセージやアプリの挙動に関する詳細情報をお知らせいただけると、問題解決に役立ちます。

psmuler commented 1 year ago

caught TypeError: Cannot read properties of null (reading 'addEventListener') at renderer.js:5:9

psmuler commented 1 year ago

このエラーは、renderer.jsの5行目で、fileBtnnullであるために発生しています。これは、document.getElementById('file-btn')が、index.htmlに存在しない要素を参照しているか、renderer.jsがHTML要素の読み込み前に実行されていることを意味します。

index.htmlrenderer.jsを読み込むタイミングを修正して、この問題を解決できます。renderer.js<body>タグの終了直前に移動させてみてください。

index.htmlファイルを以下のように更新してください。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>My Electron App</title>
  </head>
  <body>
    <h1>Hello, Electron!</h1>
    <button id="file-btn">File</button>

    <script src="renderer.js"></script>
  </body>
</html>

この変更により、renderer.js<body>内のすべての要素が読み込まれた後に実行されるようになり、エラーが解決されるはずです。アプリを再起動して、"File"ボタンが正常に動作するかどうかを確認してください。