🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

20290閲覧

Pythonのexe化で画像を組み込みたい

tomo1998

総合スコア34

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/01/12 14:19

編集2019/01/13 15:56

前提・実現したいこと

tkinterを使った画像の含まれるプログラムを他人に配布したいと思い、exe化しようとしています。

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

cmdから実行すると以下のエラーコードが確認できました
Error loading Python DLL 'C:\アドレス\clicktest2\python37.dll'.
LoadLibrary: 指定されたモジュールが見つかりません。

該当のソースコード

import tkinter as tk root = tk.Tk() photo=tk.PhotoImage(file="icon000.png") label=tk.Label(root,image=photo) label.pack() root.mainloop()

このコードを
pyinstaller ファイル名.py
でexeしてみました。

以下、specファイルの方のコード

# -*- mode: python -*- block_cipher = None a = Analysis(['clicktest.py'], pathex=['C:\Users\tomoa\Documents\game'], binaries=[], datas=[], hiddenimports=[], hookspath=[], 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, [], exclude_binaries=True, name='clicktest2', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='clicktest2')

試したこと

試しにコードから、
photo=tk.PhotoImage(file="icon000.png")
label=tk.Label(root,image=photo)
label.pack()
を削除してexe化したらエラーは起こらなくなりました、ので問題は外部の画像ファイル読み込みに問題があると考えています・・・
画像、音源等を含んだexeを作るには、コマンド実行時に自動生成されるspecファイルを編集すればいいという事は分かったのですが、うまく行きませんでした( ̄▽ ̄;)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/01/13 01:21

その起きたというエラーのエラーメッセージをそのまま提示してください
tomo1998

2019/01/13 11:17

すいません、exeプログラムを実行したらcmdのような黒い画面が出るのですが、次の瞬間には消えてしまっているのでエラーメッセージは確認できませんでした・・・ ただ、このコードをpythonで普通に実行してもエラーは起こりません(当たり前のことですが・・・ ( ̄▽ ̄;)
firedfly

2019/01/13 15:50

こんにちは。 cmdからexeを起動すればエラーメッセージを確認できます。
tomo1998

2019/01/13 15:56

なるほど!確認できました~!
guest

回答1

0

ベストアンサー

こんにちは。
興味があったので試してみました。
かなり大変で、最適解かはわかりません。
参考:python - Pyinstaller and --onefile: How to include an image in the exe file - Stack Overflow

画像ファイルの参照方法を変更

exeに含まれるファイルは実行時に別フォルダに展開されるので
(例:%USERPROFILE%/AppData/Local/Temp/_MEIxxxxxx)
これを参照できるように resource_path() を追加し、参照時はこれを使用します。

Python

1import tkinter as tk 2import sys 3import os 4 5 6def resource_path(relative_path): 7 if hasattr(sys, '_MEIPASS'): 8 return os.path.join(sys._MEIPASS, relative_path) 9 return os.path.join(os.path.abspath("."), relative_path) 10 11 12root = tk.Tk() 13photo = tk.PhotoImage(file=resource_path("icon000.png")) 14label = tk.Label(root, image=photo) 15label.pack() 16root.mainloop()

specファイルを作成

下のコマンドを実行すると、distフォルダ内に実行ファイルとspecが作成されます。
ただしまだ、必要ファイルが同梱されたexeファイルではないです。

pyinstaller test.py

specファイルに追記

外部ファイルはdatasに記述する仕様なので
a.datas += [('icon000.png', '.\icon000.png', 'DATA')]などを加えます。
またEXE()の引数のexclude_binaries=False,を削除し
a.binaries,a.datas,を追加します。
(console=Falseはお好みで。余計なコンソールが開かなくなります。)

# -*- mode: python -*- block_cipher = None a = Analysis(['test.py'], pathex=['D:\Desktop'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) a.datas += [('icon000.png', '.\icon000.png', 'DATA')] pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.datas, name='test', debug=False, strip=None, upx=True, console=False) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='test')

specファイルを使ってexeを作成

下のようにspecファイルを指定してexeを作成します。

pyinstaller test.spec

distフォルダのexeを確認

dist/test.exeは単体でも画像を表示できることを確認できます。

投稿2019/01/13 16:52

編集2019/01/14 11:00
firedfly

総合スコア1131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomo1998

2019/01/17 14:07

なるほど、うまく行きました~!ありがとうございます(`・ω・´)ゞ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問