python3とtkinterを用いてカメラ映像をon/off出来るボタン付きGUIを作成したい
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'
◆コード
import cv2
from PIL import Image
from PIL import ImageTk
import threading
import tkinter as tk
def button1_clicked():
thread = threading.Thread(target=videoLoop, args=())
thread.start()
def button2_clicked():
thread = threading.Thread(target=destroy, args=())
thread.start()
def destroy(panel):
panel.destroy()
def videoLoop(mirror=False):
No=0
cap = cv2.VideoCapture(No)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 800)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 600)
while True:
ret, to_draw = cap.read()
if mirror is True:
to_draw = to_draw[:,::-1]
image = cv2.cvtColor(to_draw, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
image = ImageTk.PhotoImage(image)
panel = tk.Label(image=image)
panel.image = image
panel.place(x=50, y=50)
return panel
root = tk.Tk()
root.geometry("1920x1080+0+0")
button1 = tk.Button(root, text="start", bg="#fff", font=("",50), command=button1_clicked)
button1.place(x=1000, y=100, width=400, height=250)
button2 = tk.Button(root, text="stop", bg="#fff", font=("",50), command=button2_clicked)
button2.place(x=1000, y=360, width=400, height=250)
root.mainloop()
どうかよろしくお願い致します。