質問編集履歴

1

進捗に応じた質問の変化

2018/12/05 08:13

投稿

hokahomu
hokahomu

スコア38

test CHANGED
@@ -1 +1 @@
1
- Pythonのtkinterを用いたGUIアプリケーションでボタンを押した際の動作がうまくいかない
1
+ Pythonのtkinterを用いたGUIアプリケーションでボタンを押した際の動作が実行できない
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- tkinterを用いたGUIのアプリケーションを作っているのですが、実行ボタンが押された際に関数を実行して目的の動作を行わせ、停止ボタンが押された際に停止させようと思っていのですが、うまく実行ことができません。解決方法を教えてただけるとありがたいす。
3
+ tkinterを用いたGUIのアプリケーションを作っているのですが、実行ボタンが押された際に関数を実行して目的の動作を行わせ、停止ボタンが押された際に停止させようと思っています。ボタンを押した際動作はうまくいったのですが、停止ボタンを押そとしてもstartの関数内でループしてしい停止ボタンを押すことができません、どうすればよいでしょうか
4
4
 
5
5
  ### 該当のソースコード
6
6
 
@@ -24,11 +24,13 @@
24
24
 
25
25
  import tkinter
26
26
 
27
- t=1
27
+
28
-
28
+
29
- def start1():
29
+ root =tkinter.Tk()
30
+
30
-
31
+ root.title(u"app")
32
+
31
- t=0
33
+ root.geometry("600x700")
32
34
 
33
35
 
34
36
 
@@ -198,17 +200,155 @@
198
200
 
199
201
 
200
202
 
201
-
203
+ def start():
204
+
205
+
206
+
202
-
207
+ # 内蔵カメラを起動(カメラが一つしか繋がっていない場合は、引数に0を渡せば良い)
208
+
209
+ cap = cv2.VideoCapture(1)
210
+
211
+
212
+
213
+ flgb1=0
214
+
215
+ flgt1=0
216
+
217
+ flgb2=0
218
+
219
+ flgt2=0
220
+
221
+
222
+
223
+ while True:
224
+
225
+
226
+
227
+ # 赤色の円を抽出する
228
+
229
+ frame = cap.read()[1]
230
+
231
+ getframe1 = getCircle1(frame, np.array([130,80,80]), np.array([200,255,255]))
232
+
233
+ #黄色の円を検出
234
+
235
+ getframe2 = getCircle2(frame, np.array([30,50,50]), np.array([80,255,255]))
236
+
237
+
238
+
239
+ #赤が見つかったら
240
+
241
+ if getframe1 is not None:
242
+
243
+ # 見つかった円の上に青い円を描画
244
+
245
+ # getframe[0]:中心座標、getframe[1]:半径
246
+
247
+ cv2.circle(frame, getframe1[0], getframe1[1], (255, 0, 0), 2)
248
+
249
+ if flgb1==0:#flgb1が0の時
250
+
251
+ filename = 'ファイルパス' #再生したいmp3ファイル
252
+
253
+ pygame.mixer.init()
254
+
255
+ pygame.mixer.music.load(filename) #音源を読み込み
256
+
257
+ mp3_length = mp3(filename).info.length #音源の長さ取得
258
+
259
+ pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
260
+
261
+ time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
262
+
263
+ pygame.mixer.music.stop() #音源の長さ待ったら再生停止
264
+
265
+ flgb1=1#flgb1に1を代入し一回だけの処理
266
+
267
+ flgt1=0#flgt1に0を代入し時間処理を可能にする
268
+
269
+ at1=time.time()+5#今の時間+5秒
270
+
271
+
272
+
273
+ #黄色が見つかったら
274
+
275
+ if getframe2 is not None:
276
+
277
+ # 見つかった円の上に青い円を描画
278
+
279
+ # getframe[0]:中心座標、getframe[1]:半径
280
+
281
+ cv2.circle(frame, getframe2[0], getframe2[1], (255, 0, 0), 2)
282
+
283
+ if flgb2==0:#flgb2が0の時
284
+
285
+ filename = 'ファイルパス' #再生したいmp3ファイル
286
+
287
+ pygame.mixer.init()
288
+
289
+ pygame.mixer.music.load(filename) #音源を読み込み
290
+
291
+ mp3_length = mp3(filename).info.length #音源の長さ取得
292
+
293
+ pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
294
+
295
+ time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
296
+
297
+ pygame.mixer.music.stop() #音源の長さ待ったら再生停止
298
+
299
+ flgb2=1#flgb2に1を代入し一回だけの処理
300
+
301
+ flgt2=0#flgt2に0を代入し時間処理を可能にする
302
+
303
+ at2=time.time()+5#今の時間+5秒
304
+
305
+
306
+
203
- root =tkinter.Tk()
307
+ nt1=time.time()
308
+
204
-
309
+ nt2=time.time()
310
+
311
+
312
+
313
+ if flgb1==1 and flgt1==0 and at1<=nt1:
314
+
315
+ flgb1=0
316
+
317
+ flgt1=1
318
+
319
+
320
+
321
+ if flgb2==1 and flgt2==0 and at2<=nt2:
322
+
323
+ flgb2=0
324
+
325
+ flgg2=1
326
+
327
+
328
+
329
+ # 検出結果とともに映像を表示
330
+
331
+ cv2.imshow('Circle Detect', frame)
332
+
333
+
334
+
335
+
336
+
337
+ if cv2.waitKey(1) & 0xFF == ord('q'):
338
+
339
+ break
340
+
341
+
342
+
343
+ # 終了時にカメラを解放
344
+
345
+ cap.release()
346
+
205
- root.title(u"app")
347
+ cv2.destroyAllWindows()
206
-
207
- root.geometry("600x700")
348
+
208
-
209
-
210
-
349
+
350
+
211
- btn1=tkinter.Button(root, text='aモード 開始',font=(" ",20),bg='#f0e68c',fg='#ff0000',height=5,width=14,command=start1)
351
+ btn1=tkinter.Button(root, text='aモード 開始',font=(" ",20),bg='#f0e68c',fg='#ff0000',height=5,width=14,command=start)
212
352
 
213
353
  btn1.place(x=50,y=170)
214
354
 
@@ -220,169 +360,21 @@
220
360
 
221
361
 
222
362
 
223
- if t==0:
224
-
225
- # 内蔵カメラを起動(カメラが一つしか繋がっていない場合は、引数に0を渡せば良い)
226
-
227
- cap = cv2.VideoCapture(1)
228
-
229
-
230
-
231
- flgb1=0
232
-
233
- flgt1=0
234
-
235
- flgb2=0
236
-
237
- flgt2=0
238
-
239
-
240
-
241
- while True:
242
-
243
- # 赤色の円を抽出する
244
-
245
- frame = cap.read()[1]
246
-
247
- getframe1 = getCircle1(frame, np.array([130,80,80]), np.array([200,255,255]))
248
-
249
- #黄色の円を検出
250
-
251
- getframe2 = getCircle2(frame, np.array([30,50,50]), np.array([80,255,255]))
252
-
253
-
254
-
255
- #赤が見つかったら
256
-
257
- if getframe1 is not None:
258
-
259
- # 見つかった円の上に青い円を描画
260
-
261
- # getframe[0]:中心座標、getframe[1]:半径
262
-
263
- cv2.circle(frame, getframe1[0], getframe1[1], (255, 0, 0), 2)
264
-
265
- if flgb1==0:#flgb1が0の時
266
-
267
- filename = 'ファイルのパス' #再生したいmp3ファイル
268
-
269
- pygame.mixer.init()
270
-
271
- pygame.mixer.music.load(filename) #音源を読み込み
272
-
273
- mp3_length = mp3(filename).info.length #音源の長さ取得
274
-
275
- pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
276
-
277
- time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
278
-
279
- pygame.mixer.music.stop() #音源の長さ待ったら再生停止
280
-
281
- flgb1=1#flgb1に1を代入し一回だけの処理
282
-
283
- flgt1=0#flgt1に0を代入し時間処理を可能にする
284
-
285
- at1=time.time()+5#今の時間+5秒
286
-
287
-
288
-
289
- #黄色が見つかったら
290
-
291
- if getframe2 is not None:
292
-
293
- # 見つかった円の上に青い円を描画
294
-
295
- # getframe[0]:中心座標、getframe[1]:半径
296
-
297
- cv2.circle(frame, getframe2[0], getframe2[1], (255, 0, 0), 2)
298
-
299
- if flgb2==0:#flgb2が0の時
300
-
301
- filename = 'ファイルのパス' #再生したいmp3ファイル
302
-
303
- pygame.mixer.init()
304
-
305
- pygame.mixer.music.load(filename) #音源を読み込み
306
-
307
- mp3_length = mp3(filename).info.length #音源の長さ取得
308
-
309
- pygame.mixer.music.play(1) #再生開始。1の部分を変えるとn回再生(その場合は次の行の秒数も×nすること)
310
-
311
- time.sleep(mp3_length + 0.25) #再生開始後、音源の長さだけ待つ(0.25待つのは誤差解消)
312
-
313
- pygame.mixer.music.stop() #音源の長さ待ったら再生停止
314
-
315
- flgb2=1#flgb2に1を代入し一回だけの処理
316
-
317
- flgt2=0#flgt2に0を代入し時間処理を可能にする
318
-
319
- at2=time.time()+5#今の時間+5秒
320
-
321
-
322
-
323
-
324
-
325
-
326
-
327
- nt1=time.time()
328
-
329
- nt2=time.time()
330
-
331
-
332
-
333
- if flgb1==1 and flgt1==0 and at1<=nt1:
334
-
335
- flgb1=0
336
-
337
- flgt1=1
338
-
339
-
340
-
341
- if flgb2==1 and flgt2==0 and at2<=nt2:
342
-
343
- flgb2=0
344
-
345
- flgg2=1
346
-
347
-
348
-
349
- # 検出結果とともに映像を表示
350
-
351
- cv2.imshow('Circle Detect', frame)
352
-
353
-
354
-
355
-
356
-
357
- if cv2.waitKey(1) & 0xFF == ord('q'):
358
-
359
- break
360
-
361
-
362
-
363
- # 終了時にカメラを解放
364
-
365
- cap.release()
366
-
367
- cv2.destroyAllWindows()
368
-
369
-
370
-
371
-
372
-
373
363
  root.mainloop()
374
364
 
375
365
 
376
366
 
367
+
368
+
377
369
  ```
378
370
 
379
371
 
380
372
 
381
373
  ### 試したこと
382
374
 
383
- ボタンが押された際にstart1の関数を呼び出し、tを0にしてから下のほうにあるif文のt==0以下の部分で目的の動作させようとした。
375
+ ボタンが押された際にstartの関数を呼び出し、動作させるこに成功した。
384
-
376
+
385
- また、停止ボタンが押された際にif以下の動作を停止させたい。
377
+ 停止ボタンが押された際にstart内の動作を停止させたい。
386
378
 
387
379
 
388
380