質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.51%

  • Python 3.x

    9829questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 492

tomo1998

score 21

前提・実現したいこと

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ファイルを編集すればいいという事は分かったのですが、うまく行きませんでした( ̄▽ ̄;)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/01/13 10:21

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

    キャンセル

  • tomo1998

    2019/01/13 20:17

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

    キャンセル

  • firedfly

    2019/01/14 00:50

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

    キャンセル

  • tomo1998

    2019/01/14 00:56

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

import tkinter as tk
import sys
import os


def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)


root = tk.Tk()
photo = tk.PhotoImage(file=resource_path("icon000.png"))
label = tk.Label(root, image=photo)
label.pack()
root.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/17 23:07

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

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9829questions

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