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

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

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

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

Python

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

Q&A

1回答

2694閲覧

tkinterで作ったGUI上で動画を再生したい

namamonowakaran

総合スコア4

Tkinter

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

Python

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

0グッド

0クリップ

投稿2019/10/23 14:04

前提・実現したいこと

tkinterで作ったGUI上で動画を再生したいと考えています。

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

cv2.imshowはtkinterで使えないようで、canvas上で動画が再生されればよいと思ったのですが、その処理がうまくわかりません。また、再生・一時停止・クリック時の時間データを取得する3つのボタンもつけたいと考えています。

該当のソースコード

python

1```import sys 2import tkinter 3from tkinter import * 4from tkinter import ttk 5from tkinter.font import Font 6from PIL import Image, ImageTk 7import cv2 8 9 10 11def button_click(): 12 txt.insert('end', "取得したビデオの現在時間\n") 13 txt.see('end') 14 15#def start_click(): 16 17 18# GUI設定 19# 20root = tkinter.Tk() 21root.title(u"TkinterのCanvasを使ってみる") 22root.geometry("1280x720+125+25") 23root.columnconfigure(0, weight=1) 24root.rowconfigure(0, weight=1) 25 26# Frame 27frame1 = ttk.Frame(root, padding=10) 28frame1.rowconfigure(1, weight=1) 29frame1.columnconfigure(0, weight=1) 30frame1.grid(sticky=(N,W,S,E)) 31 32#Button 33button1 = ttk.Button(frame1, text='OK', command=button_click) 34button1.place(x=1100, y=650) 35 36# Text 37f = Font(family='Helvetica', size=11) 38v1 = StringVar() 39txt = Text(frame1,width=10,height=30) 40txt.configure(font=f) 41txt.place(x=1100, y=60) 42 43# Scrollbar 44scrollbar = ttk.Scrollbar( 45 frame1, 46 orient=VERTICAL, 47 command=txt.yview) 48txt['yscrollcommand'] = scrollbar.set 49scrollbar.place(x=1200, y=60,height=525) 50 51 52 53#Canvas 54canvas = tkinter.Canvas(root, width = 800, height = 450)#Canvasの作成 55#canvas.create_rectangle(0, 0, 1600, 900, fill = 'green')#塗りつぶし 56canvas.place(x=100, y=100)#Canvasの配置 57 58 59 60root.mainloop() 61 62### 試したこと 63 64canvas.create_imageに動画データを入れようとしましたがうまくできませんでした。 65 66### 補足情報(FW/ツールのバージョンなど) 67 68ここにより詳細な情報を記載してください。

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

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

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

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

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

BeatStar

2019/10/25 06:22

質問のコード、「第三者として」読んでみてください。 読みやすいですか? 読みやすいようにしてください。 編集で"<コード>"(または"<code>") となっているボタンを押して、それを使って書いてください。
guest

回答1

0

こんな感じでいかがでしょう。

python

1#! /usr/bin/python3 2import tkinter 3import cv2 4import PIL.Image, PIL.ImageTk 5import time 6 7class App: 8 def __init__(self, window, window_title, video_source=0): 9 self.window = window 10 self.window.title(window_title) 11 self.video_source = video_source 12 self.vid = MyVideoCapture(self.video_source) 13 self.canvas = tkinter.Canvas(window, width = self.vid.width, height = self.vid.height) 14 self.canvas.pack() 15 self.btn_snapshot=tkinter.Button(window, text="Snapshot", width=50, command=self.snapshot) 16 self.btn_snapshot.pack(anchor=tkinter.CENTER, expand=True) 17 self.delay = 15 18 self.update() 19 self.window.mainloop() 20 def snapshot(self): 21 ret, frame = self.vid.get_frame() 22 if ret: 23 cv2.imwrite("frame-" + time.strftime("%d-%m-%Y-%H-%M-%S") + ".jpg", cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) 24 def update(self): 25 ret, frame = self.vid.get_frame() 26 if ret: 27 self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame)) 28 self.canvas.create_image(0, 0, image = self.photo, anchor = tkinter.NW) 29 30 self.window.after(self.delay, self.update) 31class MyVideoCapture: 32 def __init__(self, video_source=0): 33 # Open the video source 34 self.vid = cv2.VideoCapture(video_source) 35 if not self.vid.isOpened(): 36 raise ValueError("Unable to open video source", video_source) 37 38 self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH) 39 self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT) 40 def get_frame(self): 41 if self.vid.isOpened(): 42 ret, frame = self.vid.read() 43 if ret: 44 return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) 45 else: 46 return (ret, None) 47 else: 48 return (ret, None) 49 def __del__(self): 50 if self.vid.isOpened(): 51 self.vid.release() 52App(tkinter.Tk(), "Tkinter and OpenCV")

(参考)
https://solarianprogrammer.com/2018/04/21/python-opencv-show-video-tkinter-window/

または、もし再生したい動画が音付きなのであれば、opencvではなくなりますが、こんなのはどうでしょうか。
お役に立てれば幸いです。

投稿2020/06/14 16:09

編集2020/06/14 16:31
Marusoftware

総合スコア189

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問