2016-05-19 3 views
0

Я пытаюсь создать графический интерфейс, который открывает видео и изображение под ним:Проблемы с отображением видео в Tkinter

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
# 
import Image, ImageTk 
import Tkinter, tkMessageBox 
import ttk 

import cv2 
import sys 

width, height = 800, 600 
banner = cv2.imread('../data/banner.png') 
b,g,r = cv2.split(banner) 
banner = cv2.merge((r,g,b)) 
im = Image.fromarray(banner) 
cap = cv2.VideoCapture('../data/sample.mov') 


root = Tkinter.Tk() 
root.bind('<Escape>', lambda e: root.quit()) 
root.title("Contador") 
root.columnconfigure(0, weight=1) 
root.rowconfigure(0, weight=1) 

lmain = Tkinter.Label(root) 
lmain.grid(row=0,column=0,sticky='nsew') 
bmain = Tkinter.Label(root) 
bmain.grid(row=1,column=0,sticky='nsew') 
baner = ImageTk.PhotoImage(image=im) 
bmain.configure(image=baner) 

def show_frame(): 
    _, frame = cap.read() 
    if frame is None: 
     return 
# labelWidth = root.winfo_screenwidth() 
# labelHeight = root.winfo_screenheight() 
# maxsize = (labelWidth, labelHeight) 
# frame = frame.resize(maxsize) 
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
    img = Image.fromarray(frame) 
    imgtk = ImageTk.PhotoImage(image=img) 
    lmain.imgtk = imgtk 
    lmain.configure(image=imgtk) 
    lmain.after(10, show_frame) 

show_frame() 
root.mainloop() 

Проблемы у меня возникают, являются следующие:

  • I необходимо изменить размер изображения в соответствии с меткой.
  • прокомментированная часть, которую я получил отсюда (how to fit image to label in Python), но она дает ошибку номера канала (строка 40) и далее вниз код дает ошибку NoneType (строка 41) и недопустимый тип изображения (массив numpy) в строке 42
  • изображение и видео не изменять размер при изменении размера окна

Так что мне нужно решение для этого TkInter кода (или даже лучше, рамки для питона)

+0

Есть ли конкретная причина, по которой вы хотите изменить размер после каждого кадра? Почему бы не сделать 'root.bind (« », resize_frame)' и при необходимости изменить размер? Вызовы 'winfo_screenwidth()' и 'winfo_screenheight()' должны возвращать всегда одно и то же значение, пока вы остаетесь на одном экране. Вы изменяете размер «фрейм», но изменяете ли вы его родительский контейнер? – R4PH43L

+0

Я изменяю размер каждого кадра, потому что видео начинается как больше, чем ярлык, и я не нашел способ придерживаться размера этикеток. –

ответ

0

я узнал, что эта проблема , Оказывается линии я получил от другого вопроса:

frame = frame.resize(maxsize) 

должно быть:

frame = cv2.resize(frame, maxsize) 

Кроме того, чтобы получить размер лейбла команда:

labelWidth = lmain.winfo_width() 
labelHeight = lmain.winfo_height() 

так

labelWidth = root.winfo_width() 
labelHeight = root.winfo_height() 

получает размер корня не метки.

Смежные вопросы