回答編集履歴

2

問題の検証用のコードを追加

2021/05/23 21:17

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -67,3 +67,51 @@
67
67
  canvas.itemconfig(image_item, image=image_tk)
68
68
 
69
69
  ```
70
+
71
+
72
+
73
+ ----
74
+
75
+ 追記
76
+
77
+
78
+
79
+ > 画像をcanvas上で表示させることは別のプログラムでできたのですが、動画になるとできなくなります。
80
+
81
+
82
+
83
+ PhotoImage変数の生存期間の問題なので、「動画」である事が直接の原因ではないはずです。
84
+
85
+
86
+
87
+ 問題の再現・検証用のコード
88
+
89
+ ```python
90
+
91
+ import tkinter as tk
92
+
93
+
94
+
95
+ root = tk.Tk()
96
+
97
+ canvas = tk.Canvas(root, width=600, height=600)
98
+
99
+ canvas.pack()
100
+
101
+
102
+
103
+ def load_image():
104
+
105
+ # global image_tk
106
+
107
+ image_tk = tk.PhotoImage(file="a.png")
108
+
109
+ canvas.create_image(0, 0, image=image_tk, anchor=tk.NW)
110
+
111
+
112
+
113
+ root.after_idle(load_image)
114
+
115
+ root.mainloop()
116
+
117
+ ```

1

コードを追加

2021/05/23 21:17

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -13,6 +13,20 @@
13
13
 
14
14
 
15
15
  解決策: 簡易的には、変数を global 宣言することで解消できます。
16
+
17
+
18
+
19
+ ```python
20
+
21
+ def play1():
22
+
23
+ global image_tk
24
+
25
+
26
+
27
+ ...
28
+
29
+ ```
16
30
 
17
31
 
18
32
 
@@ -34,6 +48,22 @@
34
48
 
35
49
  create_image は一度のみにして、戻り値を控えておいて、
36
50
 
37
- タイマーで呼ぶ関数内では itemconfigure メソッドにより
51
+ タイマーで呼ぶ関数内では itemconfig メソッドにより
38
52
 
39
53
  imageを更新するようにします。
54
+
55
+
56
+
57
+ ```python
58
+
59
+ # NOTE: anchor 未指定の場合、image の中心座標が 0, 0 になるので、左上起点に指定
60
+
61
+ image_item = canvas.create_image(0, 0, anchor=tk.NW)
62
+
63
+
64
+
65
+ # play1 関数内
66
+
67
+ canvas.itemconfig(image_item, image=image_tk)
68
+
69
+ ```