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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

Pythonのthreadingにおける、終了時の処理

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

30659閲覧

投稿2017/05/19 13:50

###前提・実現したいこと
Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

###発生している問題・エラーメッセージ
GUIのウインドウを閉じると、GUIを閉じることはできるのですが、threadがまだ残っているのかコマンドプロンプトのコントロールが帰ってきません。

###該当のソースコード

Python

import wx import os import cv2 import numpy as np import threading import sys GUI_IMAGE_X = 240 GUI_IMAGE_Y = 180 CAMMODE = False ######################################################################## class DnDPanel(wx.Panel): #---------------------------------------------------------------------- def __init__(self, parent): wx.Panel.__init__(self, parent=parent) # Image box img = wx.Image(GUI_IMAGE_X,GUI_IMAGE_Y) # Statc bitmap self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,wx.Bitmap(img)) # Text box self.fileTextCtrl = wx.TextCtrl(self,style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(self.imageCtrl, 1, wx.ALL, 5) sizer.Add(self.fileTextCtrl, 1, wx.EXPAND|wx.ALL, 5) self.SetSizer(sizer) self.Fit() #---------------------------------------------------------------------- def updateText(self, text): #Overwtite a text self.fileTextCtrl.SetValue(text) #Add a text #self.fileTextCtrl.WriteText(text) #---------------------------------------------------------------------- def updateImage_Entity(self, cv2image): # Calculate aspect rat mag_X = GUI_IMAGE_X / cv2image.shape[1] mag_Y = GUI_IMAGE_Y / cv2image.shape[0] if mag_X < mag_Y: img = cv2.resize(cv2image, None, fx = mag_X, fy = mag_X) else: img = cv2.resize(cv2image, None, fx = mag_Y, fy = mag_Y) # Calculate aspect ratio diff # X-axis diff_X = GUI_IMAGE_X - img.shape[1] diff_X_start = round(diff_X/2) diff_X_end = diff_X_start + img.shape[1] # Y-axis diff_Y = GUI_IMAGE_Y - img.shape[0] diff_Y_start = round(diff_Y/2) diff_Y_end = diff_Y_start + img.shape[0] #print("[(%s,%s) : (%s,%s)]"%(diff_X_start,diff_Y_start,diff_X_end,diff_Y_end)) # Create modified picture bg_image = np.zeros((GUI_IMAGE_Y, GUI_IMAGE_X, 3), np.uint8) bg_image[diff_Y_start:diff_Y_end,diff_X_start:diff_X_end] = img # BGR --> RGB img = cv2.cvtColor(bg_image, cv2.COLOR_BGR2RGB) # Convert color array to bitmap image img = wx.Bitmap.FromBuffer(img.shape[1], img.shape[0], img) #Static bitmap self.imageCtrl.SetBitmap(img) ######################################################################## class CameraControl(threading.Thread): def __init__(self,parent): threading.Thread.__init__(self) # Prepare camera mode self.panelText = DnDPanel(parent).updateText self.panelImage = DnDPanel(parent).updateImage_Entity #---------------------------------------------------------------------- def run(self): global CAMMODE if CAMMODE == False: return False # End other daemon thread at first while threading.activeCount() > 2: CAMMODE = False # Start only one daemon thread CAMMODE = True while CAMMODE == True : # Get camera information : "0" is device numer cap = cv2.VideoCapture(0) ret, frame = cap.read() while ret == False: # Get camera information : "0" is device numer cap = cv2.VideoCapture(0) ret, frame = cap.read() self.panelText("ERROR: Camera is not working.") return False while ret == True: cv2.waitKey(1) ret, frame = cap.read() self.panelText("Camera mode") # Load an image to entity from file self.panelImage(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) if CAMMODE == False: ret = False ######################################################################## class DnDFrame(wx.Frame): #---------------------------------------------------------------------- def __init__(self): self.window = wx.Frame.__init__(self, parent=None, title="GUI test", style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER) self.InitMenu() self.panel = DnDPanel(self) self.Fit() self.cc = CameraControl(self) self.cc.setDaemon(True) self.cc.start() self.Show() #---------------------------------------------------------------------- # Initialize def InitMenu(self): # Menubar menubar = wx.MenuBar() fileMenu = wx.Menu() f_item2 = fileMenu.Append(wx.ID_ANY, '&Camera(C)', 'Load image from USB camera') fileMenu.AppendSeparator() f_item3 = fileMenu.Append(wx.ID_ANY, '&Quit(Q)', 'Quit application') menubar.Append(fileMenu, '&File(F)') self.SetMenuBar(menubar) # Event call definition self.Bind(wx.EVT_MENU, self.OnCamera, f_item2) self.Bind(wx.EVT_MENU, self.OnQuit, f_item3) # Frame definition self.Centre() # Status bar self.CreateStatusBar() self.setstatusbarTXT("") self.Show(True) #---------------------------------------------------------------------- # Event hander: set status text def setstatusbarTXT(self, msg): self.SetStatusText(msg) #---------------------------------------------------------------------- # Event: Quit def OnQuit(self,event): global CAMMODE CAMMODE = False sys.exit() #---------------------------------------------------------------------- # Event: Camera def OnCamera(self, event): global CAMMODE CAMMODE = True self.panel.updateText("Camera mode") self.setstatusbarTXT("Camera mode") self.cc = CameraControl(self) self.cc.setDaemon(True) self.cc.start() #---------------------------------------------------------------------- if __name__ == "__main__": app = wx.App(False) frame = DnDFrame() app.MainLoop()

###試したこと
class CameraControlのrunにあるwhileloopの中にprint("foobar")のようなでバグ文字列を吐かせましたが、GUI終了時にはデバグ文字列は出てきませんでしたので、whileloopで躓いているわけではなさそうです。

###補足情報
Win10(64bit)
Python 3.5.3(64bit)
wxPython 4.0.0a1 (Phoenix)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。