PyinstallerでwxPythonを使ったプログラムをコンパイルする際、同梱データが正しく読み込まれません

実現したいこと

wxPythonの練習でGUIアプリを作成し、Pyinstallerでコンパイルしたいと考えています。
プログラムそのものの概要は以下の通りです。

  • 「Word2Emoji」ライブラリを用いて、入力されたテキスト(日本語の場合はGoogleTransで翻訳してから適用)に合った絵文字を返す。
  • 正しく絵文字に変換できなかった(Word2Emojiの使用上うんちの絵文字が出力される)場合、同梱した音源ファイル「fail.mp3」を再生してからメッセージボックスを表示する。
  • 正しく変換できた場合には出力された絵文字をコピーし、同梱した音源「success.mp3」を再生する。

前提

上記の内容のプログラムは既に作成済みで、pyファイルから実行する上では問題なく動作しています。
ただ、Pyinstallerで「emoji.png」(wxPythonのウィンドウにっ表示したいアイコン)・「fail.mp3」・「success.mp3」を同梱してプログラムをコンパイルしようとすると、exeファイルの起動時に下記のエラーが出力され、送信ボタンも一切反応しなくなってしまいます。

エラーを読む限り同梱ファイルが正しく読み込まれていないのかと思うのですが、指定方法などが誤っているのでしょうか。

ご教示いただければ幸いです。

発生している問題・エラーメッセージ

コンパイルしたexeファイルを起動する際、以下のようなエラーが出力されます。

なお、GUIそのものは起動しますが、テキストを入力して送信ボタンを選択しても一切反応しません。

can't open file 'emoji.png' (error 2: 指定されたファイルが見つかりません。); Time: 13:03:24 1の2 Failed to load image from file "emoji.png".; Time: 13:03:24 2の2

該当のソースコード

ディレクトリ構成

emoji-search: □emoji.ico □emoji.png □emoji-search.py □emoji-search.spec □fail.mp3 □success.mp3

Pythonファイル(emoji-search.py)

※wxPythonを使うのが初めてなのでコードが散らかっているかもしれませんが、ご容赦ください。

Python

1import wx 2import word2emoji as we 3import pyperclip 4from googletrans import Translator 5import playsound 6 7def search_emoji(searchword):8 translator = Translator()9 engorig = translator.translate(searchword, src='ja', dest='en').text 10 engword = engorig.lower()11 result = we(engword)12 if result == "💩":13 playsound.playsound('fail.mp3')14 wx.MessageBox(u'変換できる絵文字が見つかりませんでした。違う言葉で再建策してください。', u'変換失敗')15 else:16 playsound.playsound('success.mp3')17 pyperclip.copy(result)18 19class ProxyFrame(wx.Frame):20 def __init__(self):21 super(ProxyFrame, self).__init__(None, wx.ID_ANY, "絵文字変換", size=(300, 150))22 panel = wx.Panel(self)23 24 self.searchword_label = wx.StaticText(panel, label="検索ワード:")25 self.searchword_input = wx.TextCtrl(panel)26 self.submit_button = wx.Button(panel, label="絵文字コピー >>")27 28 self.Bind(wx.EVT_BUTTON, self.on_submit, self.submit_button)29 30 sizer = wx.BoxSizer(wx.VERTICAL)31 sizer.Add(self.searchword_label, 0, wx.ALL, 5)32 sizer.Add(self.searchword_input, 0, wx.EXPAND | wx.ALL, 5)33 sizer.Add(self.submit_button, 0, wx.ALL | wx.CENTER, 5)34 35 panel.SetSizer(sizer)36 37 def on_submit(self, event):38 searchword = self.searchword_input.GetValue()39 search_emoji(searchword)40 41if __name__ == "__main__":42 app = wx.App()43 frame = ProxyFrame()44 frame.SetIcon(wx.Icon('emoji.png'))45 frame.Show()46 app.MainLoop()

Specファイル

# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['emoji-search.py'], pathex=[], binaries=[], datas=[('emoji.png', '.'), ('fail.mp3', '.'), ('success.mp3', '.')], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='emoji-search', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon=['emoji.ico'], )

Pyinstaller実行時のコマンド

※Pyinstallerの処理ではエラーは発生しません。

pyinstaller emoji-search.py --onefile --noconsole --icon=emoji.ico --add-data "emoji.png;." --add-data "fail.mp3;." --add-data "success.mp3;."

試したこと

  • 初めはアイコンとしてい指定しているファイルの形式が誤っているのかと思い、PNGファイルの代わりにICOファイルを読み込んでみました。
  • 続いていくつかの開設サイトを参考に、下記の方法でファイルを同梱しようとしましたが、やはり参照できていないようでした。
  1. 下記のコードをimport文直下に記載
  2. 各ファイルパスの指定に「resource_path」ファンクションを適用
  3. 一度「onefile」、「noconsole」、「icon」のオプションのみ適用してコンパイル
  4. 生成されたSpecファイルの「pyz,」と「a.scripts,」の間に「Tree('resources',prefix='resources'),」を追記
  5. 再度Specファイルを用いてコンパイル

Python

1import sys 2import os 3 4def resource_path(relative_path):5 if hasattr(sys, '_MEIPASS'):6 return os.path.join(sys._MEIPASS, relative_path)7 return os.path.join(os.path.abspath("."), relative_path)

補足情報(FW/ツールのバージョンなど)

よろしくお願いします。

コメントを投稿

0 コメント