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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

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

Q&A

解決済

1回答

3351閲覧

PIL.Imageのところでつまずいています。意味を教えていただきたいです。

jargon2020

総合スコア3

Python 3.x

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

0グッド

0クリップ

投稿2020/08/22 08:10

PIL.ImageとPIL.ImageTkで画像を表示するようなプログラムが教科書にあるのですが、

imageData=PIL.ImageTk.PhotoImage(newImage)
imageLabel.configure(image=imageData)
imageLabel.image=imageData

これの下2行の意味がわかりません。具体的に何をしているのか、教えていただけませんでしょうか。

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

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

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

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

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

meg_

2020/08/22 08:26

「imageLabe」は何ですか?
jargon2020

2020/08/22 12:34

ごめんなさい。本当に初心者なのでわからないです。
Daregada

2020/08/23 01:17

imageLabelそのものに代入している部分を載せれば、答えようがあります。 imageLabelはおそらくLabelウィジェットで、ラベル内に画像を表示しているのですが、提示された情報だけでは確実ではありません。
dameo

2020/08/23 03:45

以下参考情報です。動くコードがないと誰も何も言えないので。。。 """ 以下が必要 pip install pillow """ import tkinter as tk from PIL import ImageTk, Image root = tk.Tk() imageData = ImageTk.PhotoImage(Image.open('hoge.png')) imageLabel = tk.Label(root) imageLabel.configure(image=imageData) imageLabel.pack() root.mainloop() 上のコードでは、configureでラベルに画像を設定しています。 imageLabel.imageは使ってません。 何にせよ、聞きたい部分の前提部分が分からないのであれば、まずその部分を読むべきではありませんよ。不明点を先に質問した方がいいです。 ただtkinterは、tkという大昔tcl言語から使われていた、当時は簡単と噂のGUIツールキットを、pythonから使えるようにしたものなのですが、現在ドキュメントもあんまり良くなくて(主観です)、私は正直良く知りません。聞かれても正確な回答は難しいです。一応今回の部分のドキュメントは↓な辺り。 https://www.tcl.tk/man/tcl8.6/TkCmd/label.htm
guest

回答1

0

ベストアンサー

遅くなってごめんなさい。もう遅いかもしれませんが一応お答えしますね。

ここで画像データを作ります。 imageData=PIL.ImageTk.PhotoImage(newImage) で、ラベルに上の画像データを設定しています。ここまでは大丈夫ですよね? imageLabel.configure(image=imageData) で、これがわからないのですよね。以下に解説します。 imageLabel.image=imageData

この3行はおそらく関数内で実行されていませんか?

imageDataが関数内で作られたローカル変数であるため、関数を抜けたあとに、どこからも参照されていないと認識されてしまいます。

どこからも参照されていない変数はガーベッジコレクション(GC)という仕組みでメモリ節約のため削除されてしまうのです。(GCについて理解を深めたければ別途調べてください。でも今はなんとなくで大丈夫)

で、GCで画像データが消されてしまうと表示されません。

そこで、GCによる変数データ削除を動かさないようにするために、imageLabel.image というパラメーターに画像データを結びつけておき、「このデータは使うものですよ。消さないでくださいよ」とアピールしているのです。


試しに、imageLabel.image=imageDataを消してみてください。画像が表示されないはずです。

PythonのGUI作成はあくまでおまけみたいなものなので、あまり深く考えなくて良いと思いますよ。

あと、これが関数内で実行されているのでなければ、3行目は不要です。


わからないことがあったら聞いてくださいね。

ささのまさき

投稿2020/09/22 11:18

sasano-masaki

総合スコア15

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

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

jargon2020

2020/09/23 03:03

ご丁寧に回答頂き,ありがとうございました. おっしゃるとおりでした. ローカル関数をいきなり質問に書いてしまう等々,不勉強で失礼いたしました. 今後ともどうぞよろしくお願いいたします.
sasano-masaki

2020/09/23 03:05

よかったですー。 こちらこそよろしくです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問