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

回答編集履歴

2

デバッグの方法を追記

2020/08/10 21:34

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -48,4 +48,13 @@
48
48
  tcl/tk で管理しているリソースのIDの文字列になります。
49
49
 
50
50
  `pyimage1` は、PhotoImage オブジェクトに連番で自動的に付けられるIDで、
51
- tk.PhotoImage のfileに指定したのでは、その名前のファイルを探しに行ってます。
51
+ tk.PhotoImage のfileに指定したのでは、その名前のファイルを探しに行ってます。
52
+
53
+ ----
54
+ 参考までに、デバッグ方法
55
+
56
+ cv2で読み込んだ画像の確認
57
+ cv2.imshow で画像が正常であることを確認する。
58
+
59
+ tkinter のウィジェット表示の確認
60
+ FrameやCanvasに背景色を指定して、ウィジェット自身が表示されていることを確認する。

1

質問に対する回答を追記

2020/08/10 21:34

投稿

teamikl
teamikl

スコア8817

answer CHANGED
@@ -17,4 +17,35 @@
17
17
 
18
18
  また、create_imageで指定する座標は、左上の座標ではなく
19
19
  画像の中心座標で指定なので、0,0 ではなく wi2, hi2 の半分の値 が適切です。
20
- `canvas.create_image(wi2//2, hi2//2, image=img3, anchor=tk.CENTER)`
20
+ `canvas.create_image(wi2//2, hi2//2, image=img3, anchor=tk.CENTER)`
21
+
22
+
23
+ ----
24
+ > ・ImageTk.PhotoImageで読み込むと、画像がキャンバスに表示されない
25
+
26
+ 上述のレイアウト問題です。
27
+
28
+ > ・tk.PhotoImageで読み込もうとすると、既に存在するパスからでないと画像が読み込めない
29
+
30
+ fileで指定する場合はその通りです。
31
+
32
+ 他に data で読む方法もありますが、対応してない形式なので割愛して、
33
+ tk.PhotoImage では対応してないので読み込めません。
34
+
35
+ PIL(Pillow) で扱う画像を読み込むのは、ImageTk.PhotoImage を使うのが正解です。
36
+
37
+
38
+ > ・ImageTk.PhotoImageで読み込むと、引数にmaster=rootを入れられない
39
+
40
+ これは問題なく出来るはずです。
41
+
42
+ 上記のコードで `img3 = ImageTk.PhotoImage(img2, master=root)` は出来ました。
43
+
44
+ > img4 = tk.PhotoImage(file=img3, master=root)
45
+
46
+ img3 は PhotoImage オブジェクトですが、tkinter でのオブジェクトの値は
47
+ tcl/tk ライブラリとやり取りする時に文字列として評価され、
48
+ tcl/tk で管理しているリソースのIDの文字列になります。
49
+
50
+ `pyimage1` は、PhotoImage オブジェクトに連番で自動的に付けられるIDで、
51
+ tk.PhotoImage のfileに指定したのでは、その名前のファイルを探しに行ってます。