前提・実現したいこと
tkinterにpcカメラの映像を1ミリごとに表示するアプリを作りました。
そこで、映像の表示が途切れることなく、別のループ処理を実行する、という機能を加えたいと思っています。
要点は、root.afterを二つ並列して使いたいです。
発生している問題・エラーメッセージ
メインスレッドで映像処理をroot.afterで1ミリ秒ごとにループしているので、別のループ処理(xfunc)を別スレッドで実行しようとthreadingを使って書いてみたのですが、xfuncを実行している間、メインスレッドの映像処理が止まってしまいます。threadingの使い方が正しいかどうかを教えて頂きたいです。
該当のソースコード
python
1import tkinter as tk 2import cv2 3from PIL import Image 4from PIL import ImageTk 5import sys 6import threading 7import time 8wi=600 9he=400 10root=tk.Tk() 11root.geometry("600x400") 12canvas=tk.Canvas(root, width=wi, height=he) 13canvas.place(x=0,y=0) 14 15def capStart():#カメラのキャプチャー処理 16 global c, w, h, img 17 c=cv2.VideoCapture(0) 18 c.set(cv2.CAP_PROP_FRAME_WIDTH, wi) 19 c.set(cv2.CAP_PROP_FRAME_HEIGHT, he) 20 w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT) 21 22def update():#キャプチャー映像をtkinterに表示する(処理を止めたくない) 23 global img 24 ret, frame =c.read() 25 if ret: 26 img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) 27 canvas.create_image(wi*0.5,he*0.5,image=img) 28 else: 29 print("Fail") 30 root.after(1,update) 31 32def xfunc():#時間のかかるループ処理。updata()を止めずにこの処理を並列して行いたい。 33 for i in range(10000000): 34 con=i 35 print(con) 36 root.after(1000,th1) 37 #root.after(1000,xfunc) #こちらもダメでした 38 39def subthreadRun(): 40 thread_1 = threading.Thread(target=xfunc) 41 thread_1.setDaemon(True) 42 thread_1.start() 43 44capStart() 45update() 46subthreadRun() 47root.mainloop() 48 49
試したこと
concurrent.futuresを使っても駄目でした。
補足情報(FW/ツールのバージョンなど)
windows10
python3.7
tkinter8.7
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。