前提・実現したいこと
python 初心者です。
def で作った関数で読み込んだ画像ファイルを表示させようとしているのですが、
ある行の有無で、ファイル表示が左右されます。
下記コードの関数定義 def fileread 中、一番下(11行目)の
lbl.image = imageData が無いと、読み込んだファイルが表示されません。
お二人からご返信頂き考えていたのですが、
まず、lbl は21行目の lbl = tk.Label(image=imageDatac1) で宣言しており、
fileread の外なので、グローバル変数と思っています。
次に fileread の中ですが、lbl という名前を使っている為、
10行目:グローバル変数 lbl の属性 image を imageData に変更する。
11行目:グローバル変数 lbl の属性 image を imageData にする。
のように思ってしまっています。
10行目の fileread 内の lbl.configure(image = imageData) では、
lblという変数を使っていますが、21行目で宣言している lbl には繋がっておらず、
この lbl は fileread 内のローカル変数ということでしょうか?
また、fileread内の lbl がローカル変数とすると、
11行目の lbl.image = imageData があると、何故繋がるのでしょうか?
根本的に理解できておらず申し訳ありませんが、宜しくお願い致します。
発生している問題・エラーメッセージ
読み込んだ画像が表示されません。
該当のソースコード
python
1import tkinter as tk 2import tkinter.filedialog as fd 3import PIL.Image 4import PIL.ImageTk 5 6def fileread(): 7 fpath = fd.askopenfilename() 8 newImage = PIL.Image.open(fpath).resize((300,300)) 9 imageData = PIL.ImageTk.PhotoImage(newImage) 10 lbl.configure(image = imageData) ### <- lbl はローカル変数でしょうか? 11 lbl.image = imageData ### <- lbl はグローバル変数でしょうか? 12 13root = tk.Tk() 14root.title("select dog, cat") 15root.geometry("400x350") 16 17btn = tk.Button(text="画像を選ぶ", command = fileread) 18 19newImagec1 = PIL.Image.open("img\cat1.png").resize((300,300)) 20imageDatac1 = PIL.ImageTk.PhotoImage(newImagec1) 21lbl = tk.Label(image=imageDatac1) 22 23newImaged1 = PIL.Image.open("img\dog1.jpg").resize((400,300)) 24imageDatad1 = PIL.ImageTk.PhotoImage(newImaged1) 25lbl.configure(image = imageDatad1) 26lbl.image = imageDatad1 ### <- あっても無くても動く。 27 28lbl.pack() 29btn.pack() 30 31tk.mainloop() 32
試したこと
def の外で、同様の文を書いてみましたが、そちらは画像表示に影響しませんでした。
(上記コード中、26行目)
補足情報(FW/ツールのバージョンなど)
python 3.8.2