teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

頂いたご回答を元に考えました。

2020/05/10 15:24

投稿

yyohei
yyohei

スコア1

title CHANGED
File without changes
body CHANGED
@@ -1,45 +1,54 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
-  python 初心者です。
3
+ python 初心者です。
4
4
 
5
-  def で作った関数で読み込んだ画像ファイルを表示させようとしているのですが、
5
+ def で作った関数で読み込んだ画像ファイルを表示させようとしているのですが、
6
-  ある行の有無で、ファイル表示が左右されます。
6
+ ある行の有無で、ファイル表示が左右されます。
7
+ 下記コードの関数定義 def fileread 中、一番下(11行目)の
7
-  調べてと、グローバ変数とローカル変数の使い方に起因しているように思うのです
8
+ lbl.image = imageData が無いと、読み込んだファイルが表示されません。
8
-  しっくりきません。
9
9
 
10
-  下記コード関数定義 def fileread 中一番下(12行目)の
10
+ お二人からご返信頂き考えていたですが
11
-  lbl.image = imageData が無いと、読み込んだファイルが表示されません。
12
11
 
13
-  逆にdef 文の外(行目)では、lbl.image = imageDatad1 が無くても動作ます。
12
+ まずlbl 行目lbl = tk.Label(image=imageDatac1) で宣言ており、
13
+ fileread の外なので、グローバル変数と思っています。
14
14
 
15
-  ずれもエラーは発生していません。
15
+ 次に fileread の中ですが、lbl とう名前を使っている為、
16
-  何故行目lbl.image = imageData が必要なのでしょうか?
16
+ 行目:グローバル変数 lbl の属性 image imageData に変更する。
17
+ 11行目:グローバル変数 lbl の属性 image を imageData にする。
17
-  初歩的な事で申訳ありせんが、宜しくお願致します。
18
+ のように思ってしまっています。
18
19
 
20
+ 10行目の fileread 内の lbl.configure(image = imageData) では、
21
+ lblという変数を使っていますが、21行目で宣言している lbl には繋がっておらず、
22
+ この lbl は fileread 内のローカル変数ということでしょうか?
23
+
24
+ また、fileread内の lbl がローカル変数とすると、
25
+ 11行目の lbl.image = imageData があると、何故繋がるのでしょうか?
26
+
27
+ 根本的に理解できておらず申し訳ありませんが、宜しくお願い致します。
28
+
29
+
19
30
  ### 発生している問題・エラーメッセージ
20
31
 
21
32
   読み込んだ画像が表示されません。
22
33
 
23
34
  ### 該当のソースコード
35
+ ```python
24
36
  import tkinter as tk
25
37
  import tkinter.filedialog as fd
26
38
  import PIL.Image
27
39
  import PIL.ImageTk
28
40
 
29
-
30
41
  def fileread():
31
42
  fpath = fd.askopenfilename()
32
43
  newImage = PIL.Image.open(fpath).resize((300,300))
33
44
  imageData = PIL.ImageTk.PhotoImage(newImage)
34
- lbl.configure(image = imageData)
35
- lbl.image = imageData ### <- 何故必要なのでしょうか?
45
+ lbl.configure(image = imageData) ### <- lbl はローカル変数でしょうか?
46
+ lbl.image = imageData ### <- lbl はグローバル変数でしょうか?
36
47
 
37
-
38
48
  root = tk.Tk()
39
49
  root.title("select dog, cat")
40
50
  root.geometry("400x350")
41
51
 
42
-
43
52
  btn = tk.Button(text="画像を選ぶ", command = fileread)
44
53
 
45
54
  newImagec1 = PIL.Image.open("img\cat1.png").resize((300,300))
@@ -56,11 +65,11 @@
56
65
 
57
66
  tk.mainloop()
58
67
 
59
-
68
+ ```
60
69
  ### 試したこと
61
70
 
62
71
  def の外で、同様の文を書いてみましたが、そちらは画像表示に影響しませんでした。
63
- (上記コード中、2行目)
72
+ (上記コード中、2行目)
64
73
 
65
74
  ### 補足情報(FW/ツールのバージョンなど)
66
75