回答編集履歴

3

コード変更に伴い回答内の文章も修正

2021/05/11 07:49

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -18,9 +18,15 @@
18
18
 
19
19
  キャンバスのサイズを得るには、`canvas["width"]` や `cavas.winfo_reqwidth()` を用います。
20
20
 
21
- mainloop が始まる前では、キャンバスのサイズは 1 になっています。
21
+ ~~mainloop が始まる前では、キャンバスのサイズは 1 になっています。
22
-
22
+
23
- (その為 update() で更新してるのだと思いますが、不十分なケースが有るので)
23
+ (その為 update() で更新してるのだと思いますが、不十分なケースが有るので)~~
24
+
25
+
26
+
27
+ 追記: winfo_width() でサイズを正常に取れないケースを再現するコードを掲載してましたが、
28
+
29
+ 質問のコードに合わせて、ここは修正しました。
24
30
 
25
31
 
26
32
 
@@ -48,7 +54,11 @@
48
54
 
49
55
  - `create_text(canvas.winfo_reqwidth()//2, winfo_reqheight()//2, ...)`
50
56
 
51
- - キャンバス内容の初期化処理をタイマーから呼び出す。
57
+ - ~~キャンバス内容の初期化処理をタイマーから呼び出す。~~
58
+
59
+  追記: できれば mainloop 後に初期化したほうが良いのですが、
60
+
61
+  今回の問題には直接該当せず。
52
62
 
53
63
 
54
64
 

2

コード修正 winfo_width() で正常に値を取れないケースを再現するコードでしたが、canvas.update() のタイミングを質問のコードと同じになるように修正。

2021/05/11 07:49

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -100,6 +100,8 @@
100
100
 
101
101
  canvas = tk.Canvas(root, width=400, height=400)
102
102
 
103
+ canvas.pack(fill=tk.BOTH, expand=True)
104
+
103
105
 
104
106
 
105
107
  ## mainloop 前に呼び出す(現状のコードに該当)
@@ -127,8 +129,6 @@
127
129
  # root.after(1, root.after_idle, init_canvas, "after 1 idle", canvas)
128
130
 
129
131
 
130
-
131
- canvas.pack(fill=tk.BOTH, expand=True)
132
132
 
133
133
  root.mainloop()
134
134
 

1

書きかけだった文章の補完

2021/05/11 07:46

投稿

teamikl
teamikl

スコア8760

test CHANGED
@@ -146,21 +146,39 @@
146
146
 
147
147
  物理的に切れた時の挙動は デバイス固有またはOS によっても異なると思いますが、
148
148
 
149
+ 障害を検知した場合は、速やかにリソースを開放して、
149
150
 
150
-
151
- 障害を検知した場合は、リソースを開放して、エラーメッセージを表示。
151
+ エラーメッセージを表示といった対応をすることになると思います
152
152
 
153
153
 
154
154
 
155
155
 
156
156
 
157
+ 切断時にGUIが一時的にフリーズする場合は、
157
158
 
159
+ 原因はイベントループ内での時間のかかるブロッキング処理なので、
158
160
 
161
+ 該当する処理(カメラからの読み込み)を別スレッドへ移すことで回避できます。
162
+
159
- vcap.read() ... 切断時はブロッキングする可能性があるで、回避するに スレッドを使う、timeout の設定等
163
+ バスへ描画メインスレッド側で行必要があるためQueueで通信。
160
164
 
161
165
 
162
166
 
167
+ ※ 内蔵カメラでは発生しないかもしれません。
168
+
169
+
170
+
171
+
172
+
173
+ 切断時にOSが落ちる場合は、
174
+
163
- デバイス固有の問題、デバイスドライバーの不具合等には、アプリケーション側では対応不可能です。
175
+ デバイス固有の問題、デバイスドライバーの不具合等には、
176
+
177
+ アプリケーション側では対応は難しいです。
178
+
179
+
180
+
181
+ (カメラではありませんが、古いusb接続のオーディオインターフェースで経験しました。)
164
182
 
165
183
 
166
184