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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

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

Python

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

Q&A

1回答

1251閲覧

tkinterを用いて文字列検索による画像表示がしたい

NifTyfrog

総合スコア0

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/11/10 04:51

前提・実現したいこと

python初心者です。
tkinterを使った勉強をしています。

文字列を入力し、検索ボタンを押すと、下にその文字列と同じ名前を持った画像をcanvasに表示させるというものを作りたいです。
画像ファイルは同じディレクトリ内に入っています

画像ファイルの名前と同じ文字列を打ち込み、検索ボタンを押すとエラーを吐きます。
どなたか助けてください。。。

よろしくお願いします。。。

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

Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.9_3.9.2288.0_x64__qbz5n2kfra8p0\lib\tkinter\__init__.py", line 1892, in __call__ return self.func(*args) File "C:\Users\HIO\Documents\Python Scripts\glob\button.py", line 14, in Img_display img = ImageTk.PhotoImage(file=img_data,width=300,height=300) File "C:\Users\HIO\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\PIL\ImageTk.py", line 89, in __init__ image = _get_image_from_kw(kw) File "C:\Users\HIO\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\PIL\ImageTk.py", line 58, in _get_image_from_kw return Image.open(source) File "C:\Users\HIO\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\PIL\Image.py", line 2984, in open prefix = fp.read(16) File "C:\Users\HIO\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\PIL\Image.py", line 546, in __getattr__ raise AttributeError(name) AttributeError: read

該当のソースコード

python

1import tkinter as tk 2import tkinter.ttk as ttk 3from PIL import Image,ImageTk 4 5def Img_display(): 6 #受け取りはできてる 7 char = entry_char.get() + ".png" 8 #表示もできる 9 img_data = Image.open(char) 10 11 canvas = tk.Canvas(root, bg="#FFFFFF",height = 500,width=500) 12 canvas.place(x=0,y=30) 13 14 img = ImageTk.PhotoImage(file=img_data,width=300,height=300) 15 canvas.create_image(30,30,image=img,anchor=tk.NW) 16 17#rootメインウィンドウの設定 18root = tk.Tk() 19root.title("root") 20root.minsize(800,800) 21 22#メインフレームの作成と設置 23frame = ttk.Frame(root) 24frame.pack(fill=tk.BOTH,padx=20,pady=10) 25 26#ウィジェットの作成 27label_char = ttk.Label(frame,text="検索画像名:") 28entry_char = ttk.Entry(frame) 29button_search = ttk.Button(frame, text="検索",command=Img_display) 30 31#ウィジェットの設置 32label_char.grid(row=0,column=0) 33entry_char.grid(row=0,column=1) 34button_search.grid(row=0,column=2) 35 36root.mainloop()

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

問題点: PIL を使う場合と使わない場合のコードが混在してるようです

python

1# tkinter.PhotoImage の場合は file= でファイルを指定 2# ※ 最近のバージョンでは pngは対応してます。jpg は未対応なのでPILを利用します 3image = tk.PhotoImage(file="aaa.png") 4canvas.create_image(0, 0, image=image) 5 6# PILを用いる場合 7img = PIL.open("aaa.png") 8image = ImageTk.PhotoImage(img) 9canvas.create_image(0, 0, image=image)

エラーにはなりませんが、該当の処理は関数内なので追加で、
PhotoImage オブジェクトがローカル変数の場合、
関数終了時に破棄されてしまうので画像が表示されません。
グローバル変数にする、インスタンス変数等に保持する等の対策が必要です。

また、Canvas はクリック時に毎回作るのではなく、
初回に一度のみにして、キャンバス上に配置するアイテムを作成・削除するようにしましょう。
不要になったキャンバスが解放されず、蓄積されていきます。

投稿2021/11/10 10:51

teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問