前提・実現したいこと
画像パスからボタン上に埋め込みをしたいと考えております。
jpgでの表示を行おうとしておりますが、画像パスを絶対パスと連結させる時点でいまいちうまくいきません。よろしくお願いします。
C:\dir\Anaconda3\python.exe C:/dir/test.py Traceback (most recent call last): File "C:/dir/test.py", line 17, in <module> photo = ImageTk.PhotoImage(img_path, master=root) File "C:\dir\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 120, in __init__ mode = Image.getmodebase(mode) File "C:\dir\Anaconda3\lib\site-packages\PIL\Image.py", line 323, in getmodebase return ImageMode.getmode(mode).basemode File "C:\dir\Anaconda3\lib\site-packages\PIL\ImageMode.py", line 55, in getmode return _modes[mode] KeyError: 'C:\dir\testImage.jpg' Exception ignored in: <function PhotoImage.__del__ at 0x000002245FF2D048> Traceback (most recent call last): File "C:\dir\Anaconda3\lib\site-packages\PIL\ImageTk.py", line 130, in __del__ name = self.__photo.name AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
該当のソースコード
python
1ソースコード 2# -*- coding: utf-8 -*- 3from PIL import Image, ImageTk 4import os 5import tkinter as tk 6 7root = tk.Tk() 8root.title("test") 9root.geometry("500x400") 10img_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "testImage.jpg")) 11photo = ImageTk.PhotoImage(img_path, master=root) 12b = tk.Button(root, text="", image=photo) 13b.pack() 14 15root.mainloop()
試したこと
直接絶対パスを書き込むことに関しては成功しております。
この先、リスト化した画像パスを絶対パスと連結して画像を複数表示していきたいと考えております。
ファイルの中身にrを付けて\を無視するように行ったりしましたが、効果なしです。
初心者なので突破が難しく、心がおれそうです…。
補足情報(FW/ツールのバージョンなど)
python3.7
tkinter
img_pathのナカミはどうなってるでしょう
printさせるなどして、表示させてみてください
ありがとうございます
print(img_path)を行ったところ
C:\dir\testImage.jpg
となり一見問題がなさそうに見える状態なのですが、なぜか通らない状況となっております…
ファイル階層も同じ場所に保存しておりますのでそういった問題ではなさそうです。
で、そのC:\dirのフォルダにはtestImage.jpgという画像ファイルはあるんでしょうか
はい。今また確認いたしましたが同じ場所に保存していました。
ImageTk.PhotoImage(img_path, master=root)
関数の呼び出し方が間違えているように思います。
https://pillow.readthedocs.io/en/4.2.x/reference/ImageTk.html
1つめの引数は、PILイメージかmode文字列で、文字列がモードじゃないよっていうエラーが出ていますよね。
絶対パス直接指定でうまくいったときのソースを比べてみては?
! 画像の表示ができました!
ImageTk.PhotoImage(img_path, master=root)
の最初の引数に対してはローディングするファイルを見つける作業を認識させるため file= をつけねばならなかったのですね!本当にありがとうございます!
ImageTk.PhotoImage( file = img_path, master=root)
こちらで通すことができました!本当にありがとうございます!
TakaiYさん、ありがとうございます!
回答の方に投稿していただけるとベストアンサーとして評価することができるのでぜひお願いします!
回答らしくして、投稿しておきました。
ところで、「master=root」 という引数も入れていますが、不要ではありませんか?
ありがとうございます!
master = root に関しては今後特定のフレームやウィンドウに対してのみ機能する役割を作っておこうという試みで入れていたのですが、今回の質問では不必要なものでしたね。申し訳ありません!
僭越ながらベストアンサーとして評価させていただきました。
重ね重ね感謝いたします!
回答1件
あなたの回答
tips
プレビュー