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

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

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

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

Tkinter

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

Q&A

解決済

1回答

2228閲覧

tkinterでカメラ撮影を同時処理したい

tmykbys

総合スコア14

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2019/01/13 10:22

編集2019/01/13 10:28

前提・実現したいこと

tkinterで同時処理したい(mac)

GUIの処理
3秒ごとのカメラ撮影
この2つを同時処理する方法が分からず、お尋ねしたい次第です。
理想としては、GUIを操作中、3秒ごとの写真を撮るという挙動です。
また、GUIを終了後、写真撮影を辞める動作も実装したいと考えております。

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

現状では、カメラ撮影が優先され、3秒ごとの撮影のみでTkinterが起動しません。

該当のソースコード

python3

1# !/usr/bin/python3 2from tkinter import * 3import os 4#imagesnapを用いてカメラ撮影、3秒ごと 5os.system("imagesnap -q -w 1 -t 3.00 snapshot.jpg") 6 7def sel(): 8 selection = "You selected the option " + str(var.get()) 9 label.config(text = selection) 10 11root = Tk() 12var = IntVar() 13R1 = Radiobutton(root, text = "Option 1", variable = var, value = 1, 14 command = sel) 15R1.pack( anchor = W ) 16 17R2 = Radiobutton(root, text = "Option 2", variable = var, value = 2, 18 command = sel) 19R2.pack( anchor = W ) 20 21R3 = Radiobutton(root, text = "Option 3", variable = var, value = 3, 22 command = sel) 23R3.pack( anchor = W) 24 25label = Label(root) 26label.pack() 27root.mainloop() 28

試したこと

記載する場所を変えるなどは試しましたが、解決していません。

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

python3.6.1
macOS HighSierra 10.13.6

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

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

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

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

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

firedfly

2019/01/13 17:24

「記載する場所を変えるなどは試した」とありますが どう変えて、どんな結果になったか書いて頂けると嬉しいです。
tmykbys

2019/01/14 00:03

お返事ありがとうございます。 きちんと情報提示できず、申し訳ございません。 root.mainloop()の手前に書く、var = IntVar()の下に書くなどを試しましたが、tkinter内に書くと一様にカメラが動いてTkinterは起動せず、という挙動となりました。 また最後に書くとTkinterを閉じた後にカメラ起動となりました。
firedfly

2019/01/14 00:06

ありがとうございます。 そこまで確認できたらあと一歩でしたね。 問題が解決したようでなによりです。
guest

回答1

0

ベストアンサー

こんにちは。
os.system() は、呼んだプロセスが終了するまで次に進みません。

subprocess.Popen() を使うと、子プロセスを裏で動かしたまま次の処理に進めます。
また子プロセスを終了(terminate)させることもできます。

Python

1import subprocess 2import time 3 4cmd = "sleep 30" 5proc = subprocess.Popen(cmd, shell=True) 6print("process id = %s" % proc.pid) 7time.sleep(5) 8proc.terminate()

投稿2019/01/13 17:24

firedfly

総合スコア1131

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

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

tmykbys

2019/01/14 00:00

お返事ありがとうございます。 こちらのコードで無事同時処理の動作確認ができました。 終了の手順までご教授いただき、誠にありがとうございます。;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問