質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

1553閲覧

python3とtkinterを用いてカメラ映像をon/off出来るボタン付きGUIを作成したい

K.S_7315

総合スコア13

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

0クリップ

投稿2018/10/01 01:36

編集2018/10/01 09:01

前提・実現したいこと

Python3とtkinterを用いてGUIを作成しようとしたのですが、わからない点があったので質問させて頂きます。

やりたいこと
①:「startボタン」と「stopボタン」の2つのボタンが配置されているメインウィンドウの作成
②:「startボタン」を押すと、接続しているUSBカメラの映像をメインウィンドウ内に表示
③:「stopボタン」を押すと、②で表示されたUSBカメラの映像を消す(メインウィンドウは残したまま)

発生している問題・エラーメッセージ

①と②は色々なサイトを参考にして作成できたのですが、③の処理のところで
USBカメラの映像を消すことが出来なくて困っています。

現状「stopボタン」を押すとUSBカメラの映像はそのまま変化なしで、
以下のエラーメッセージで出ます。

Exception in thread Thread-8:
Traceback (most recent call last):
File "C:\Users\usr\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\usr\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
TypeError: destroy() missing 1 required positional argument: 'panel'

該当のソースコード

Python3.6.4

1import cv2 2from PIL import Image 3from PIL import ImageTk 4import threading 5import tkinter as tk 6 7 8def button1_clicked(): 9 thread = threading.Thread(target=videoLoop, args=()) 10 thread.start() 11 12def button2_clicked(): 13 thread = threading.Thread(target=destroy, args=()) 14 thread.start() 15 16def destroy(panel): 17 panel.destroy() 18 19def videoLoop(mirror=False): 20 No=0 21 cap = cv2.VideoCapture(No) 22 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800) 23 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600) 24 25 while True: 26 ret, to_draw = cap.read() 27 if mirror is True: 28 to_draw = to_draw[:,::-1] 29 30 image = cv2.cvtColor(to_draw, cv2.COLOR_BGR2RGB) 31 image = Image.fromarray(image) 32 image = ImageTk.PhotoImage(image) 33 panel = tk.Label(image=image) 34 panel.image = image 35 panel.place(x=50, y=50) 36 37 return panel 38 39 40root = tk.Tk() 41root.geometry("1920x1080+0+0") 42 43button1 = tk.Button(root, text="start", bg="#fff", font=("",50), command=button1_clicked) 44button1.place(x=1000, y=100, width=400, height=250) 45 46button2 = tk.Button(root, text="stop", bg="#fff", font=("",50), command=button2_clicked) 47button2.place(x=1000, y=360, width=400, height=250) 48 49root.mainloop()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

python3.6.4
tkinter 8.6
Anaconda3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

videoLoopで、無限ループするのではなく、フラグを参照するようにします。
button2_clickedで停止させたいときに、そのフラグを下ろしてループを終了するようにします。

投稿2018/10/01 05:44

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miurakana

2020/02/20 00:55

実行したくて フラグを参照したコードをお見せすることは可能でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問