2016-05-19 11 views
0

Ich versuche, eine GUI zu erstellen, die ein Video und ein Bild unter öffnet:Probleme Video in tkinter Anzeige

#!/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() 

Die Probleme, die ich habe, sind folgende:

  • I Sie müssen die Größe des Bildes anpassen, damit es auf das Etikett passt.
  • der kommentierte Teil habe ich von hier bekommen (how to fit image to label in Python) aber es gibt einen Kanalnummernfehler (Zeile 40) und weiter unten gibt der Code einen NoneType Fehler (Zeile 41) und einen ungültigen Bildtyp (numpy Array) in Zeile 42
  • das Bild und Video Größe nicht ändern, wenn die Größe des Fensters

Also ich brauche Lösung für dieses tkinter Code (oder sogar einen besseren Rahmen für python)

+0

Gibt es einen bestimmten Grund, warum Sie nach jedem Bild die Größe ändern möchten? Warum nicht 'root.bind (" ", resize_frame)' und nur die Größe ändern, wenn sie benötigt wird? Die Aufrufe 'winfo_screenwidth()' und 'winfo_screenheight()' sollten immer denselben Wert zurückgeben, solange Sie auf demselben Bildschirm bleiben. Sie ändern die Größe von 'frame', aber ändern Sie die Größe des übergeordneten Containers? – R4PH43L

+0

Ich vergrößere die Größe jedes Frames, weil das Video größer als das Label beginnt und ich habe keine Möglichkeit gefunden, es an der Größe der Labels festzuhalten. –

Antwort

0

fand ich heraus, was das Problem war . Schaltet die Linie heraus, dass ich aus einer anderen Frage bekam:

frame = frame.resize(maxsize) 

sein sollte:

frame = cv2.resize(frame, maxsize) 

Auch die Beschriftung der Größe zu erhalten lautet der Befehl:

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

seit

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

erhält die Größe des Stamms nicht die des Labels.

Verwandte Themen