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

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

詳細はこちら
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

button

HTMLで用いる<button>タグです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1937閲覧

画像パスを取得し、絶対パス(相対パス)と連結してtk.Buttonに表示…ができない

beginner_the_ko

総合スコア5

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

button

HTMLで用いる<button>タグです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/22 13:49

編集2019/12/22 14:57

前提・実現したいこと

画像パスからボタン上に埋め込みをしたいと考えております。
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

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

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

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

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

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

y_waiwai

2019/12/22 23:30

img_pathのナカミはどうなってるでしょう printさせるなどして、表示させてみてください
beginner_the_ko

2019/12/23 03:06

ありがとうございます print(img_path)を行ったところ C:\dir\testImage.jpg となり一見問題がなさそうに見える状態なのですが、なぜか通らない状況となっております… ファイル階層も同じ場所に保存しておりますのでそういった問題ではなさそうです。
y_waiwai

2019/12/23 03:09

で、そのC:\dirのフォルダにはtestImage.jpgという画像ファイルはあるんでしょうか
beginner_the_ko

2019/12/23 03:17

はい。今また確認いたしましたが同じ場所に保存していました。
TakaiY

2019/12/24 15:02

ImageTk.PhotoImage(img_path, master=root) 関数の呼び出し方が間違えているように思います。 https://pillow.readthedocs.io/en/4.2.x/reference/ImageTk.html 1つめの引数は、PILイメージかmode文字列で、文字列がモードじゃないよっていうエラーが出ていますよね。 絶対パス直接指定でうまくいったときのソースを比べてみては?
beginner_the_ko

2019/12/24 15:18

! 画像の表示ができました! ImageTk.PhotoImage(img_path, master=root) の最初の引数に対してはローディングするファイルを見つける作業を認識させるため file= をつけねばならなかったのですね!本当にありがとうございます! ImageTk.PhotoImage( file = img_path, master=root) こちらで通すことができました!本当にありがとうございます!
beginner_the_ko

2019/12/24 15:21

TakaiYさん、ありがとうございます! 回答の方に投稿していただけるとベストアンサーとして評価することができるのでぜひお願いします!
TakaiY

2019/12/25 14:08

回答らしくして、投稿しておきました。 ところで、「master=root」 という引数も入れていますが、不要ではありませんか?
beginner_the_ko

2019/12/25 15:23

ありがとうございます! master = root に関しては今後特定のフレームやウィンドウに対してのみ機能する役割を作っておこうという試みで入れていたのですが、今回の質問では不必要なものでしたね。申し訳ありません! 僭越ながらベストアンサーとして評価させていただきました。 重ね重ね感謝いたします!
guest

回答1

0

ベストアンサー

呼び出した関数に渡す引数の指定が間違えているようです。

text

1 File "C:\dir\Anaconda3\lib\site-packages\PIL\ImageMode.py", line 55, in getmode 2 return _modes[mode] 3KeyError: 'C:\dir\testImage.jpg'

メッセージのこの部分をみると、ファイルのパスを「mode」として扱おうとしてエラーになっているように見えます。 こういうときは、だいたい関数に渡している引数が間違えています。

呼び出し元は、これです。

python

1ImageTk.PhotoImage(img_path, master=root)

1つめの引数として問題のパスを渡しています。
この関数の仕様を調べてみると、
https://pillow.readthedocs.io/en/4.2.x/reference/ImageTk.html
このように、1つめの引数は、PILイメージかmode文字列でなければならず、エラーの内容とあ合います。

関数にファイル名を渡すのであれば、file=での指定が必要です。

投稿2019/12/25 14:07

TakaiY

総合スコア13773

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問