Как я могу остановить один и воспроизвести другой файл на этой панели? - PullRequest
0 голосов
/ 30 января 2019

Мне нужна одна помощь в моем коде, что я должен сделать, чтобы закрыть тест 1, когда я нажимаю на тест 2, чтобы запустить его снова, когда нажимаю на стоп.

Я объявил два видео в двух кнопках в моем кодев тесте 1, тест 2, когда я нажимаю test1, он воспроизводит его, когда я нажимаю второй, он делает то же самое, но ... дело в том, что когда я играю в тест 1 и нажимаю на тест 2, после этого он проигрывает как один, так и верхний на другом.и когда я нажимаю Стоп и снова нажимаю на тест 1, он не запускается.

import cv2
from tkinter import *
from PIL import Image, ImageTk
import threading
from tkinter.filedialog import askopenfilename


def resize(image):
    im = image
    new_siz = siz
    im.thumbnail(new_siz, Image.ANTIALIAS)
    return im

def size(event):
    global siz
    if siz == screenWH:
        siz = (600, 200)
    else:
        siz = screenWH
        win.state('zoomed')
    print ("size is:"), siz

def view_frame_video():
    vc = cv2.VideoCapture('C:\\Users\\Devendra\\Desktop\\VID_20190125_172553.mp4')
    if vc.isOpened():
        rval , frame = vc.read()
    else:
        rval = False

    while rval:
        rval, frame = vc.read()
        img =Image.fromarray(frame)
        img = resize(img)
        imgtk = ImageTk.PhotoImage(img)
        lbl.config(image=imgtk)
        lbl.img = imgtk
        if stop == True:
            vc.release()
            break      #stop the loop thus stops updating the label and reading imagge frames
        cv2.waitKey(1)
    vc.release()

def view_frame_video2():
    vc = cv2.VideoCapture('C:\\Users\\Devendra\\Desktop\\VID_20190129_162657.mp4')
    if vc.isOpened():
        rval , frame = vc.read()
    else:
        rval = False

    while rval:
        rval, frame = vc.read()
        img =Image.fromarray(frame)
        img = resize(img)
        imgtk = ImageTk.PhotoImage(img)
        lbl.config(image=imgtk)
        lbl.img = imgtk
        if stop == True:
            vc.release()
            break      #stop the loop thus stops updating the label and reading imagge frames
        cv2.waitKey(1)
    vc.release()

def stop_():
    global stop
    stop = True

def play():
    stop = False
    t = threading.Thread(target=view_frame_video)
    t.start()
def play2():
    stop = False
    t = threading.Thread(target=view_frame_video2)
    t.start()



win = Tk()
win.title('Data Logger')
win.geometry('1300x650')

stop = None
screenWH = (win.winfo_screenwidth(), win.winfo_screenheight())
siz = (600, 600)

Label(text='Prosthetic Hand Testing Software',font = ('times',22), fg = 'Red',width = 104, height = 2).pack()



def import_csv_data():
    global v
    csv_file_path = askopenfilename()
    print(csv_file_path)
    v.set(csv_file_path)
Label(win, text='File Path',font = ('arial' ,10), fg = 'black', width = 104, height = 2).pack()
v = StringVar()
entry = Entry(textvariable = v)
entry.pack()
Button(text='Browse Data Set',command=import_csv_data).pack()


frm_ = Frame(bg='black')
frm_.pack()
lbl = Label(frm_, bg='black')
lbl.pack(expand=True)
lbl.bind('<Double-Button-1>', size)


buttonframe = Frame(win)
buttonframe.pack(side=BOTTOM)
Button(text='Test 1', command = play,fg="Green", height=2, width=20).pack(side=LEFT)
Button(text='Test 2', command = play2,fg="Green", height=2, width=20).pack(side=LEFT)#,padx=21, pady=18)
Button(buttonframe,text='Stop', command = stop_,fg="Orange", height=2, width=20).pack(side=LEFT,padx=20, pady=18)
Button(buttonframe,text='Exit',fg="Red",command=win.destroy,height=2, width=20).pack(side=LEFT,padx=20, pady=18)
win.mainloop()

должен закрыть тест 1 и играть в тест 2, когда я нажимаю на тест 2 после теста 1, должен возобновить воспроизведение теста 1,2, когда яостановите его и снова нажмите на любую кнопку

1 Ответ

0 голосов
/ 31 января 2019

Основная проблема заключается в том, что ваш код будет создавать новый поток всякий раз, когда вы нажимаете кнопку Test 1 или Test 2.Однако старые потоки все еще работают, и поэтому существует более одного потока, обновляющего lbl, что вызывает наложение изображений.Чтобы преодолеть это, один поток создан для воспроизведения видеоКнопки Test 1 и Test 2 используются для выбора видеофайла в качестве источника.Ниже приведен модифицированный (и упрощенный) код на основе вашего кода:

import cv2
from tkinter import *
from PIL import Image, ImageTk
import threading

def play_video():
    while True:
        try:
            if vc.isOpened():
                rval, frame = vc.read()
                if rval:
                    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                    img = Image.fromarray(frame)
                    img.thumbnail(siz, Image.ANTIALIAS)
                    imgtk = ImageTk.PhotoImage(img)
                    lbl.config(image=imgtk)
                    lbl.img = imgtk
        except:
            pass

def play():
    try:
        vc.open('C:\\Users\\Devendra\\Desktop\\VID_20190125_172553.mp4')
    except:
        pass

def play2():
    try:
        vc.open('C:\\Users\\Devendra\\Desktop\\VID_20190129_162657.mp4')
    except:
        pass

def stop_():
    try:
        vc.release()
    except:
        pass


win = Tk()
win.title('Data Logger')
win.geometry('1300x650')

siz = (600, 400)

Label(text='Prosthetic Hand Testing Software', font=('times',22), fg='Red', width=104, height=2).pack()

lbl = Label(bg='black', image=ImageTk.PhotoImage(Image.new('RGB', siz)))
lbl.pack(expand=True)

buttonframe = Frame(win)
buttonframe.pack(side=BOTTOM)
Button(buttonframe, text='Test 1', command=play, fg="Green", height=2, width=20).pack(side=LEFT)
Button(buttonframe, text='Test 2', command=play2, fg="Green", height=2, width=20).pack(side=LEFT)
Button(buttonframe, text='Stop', command=stop_, fg="Orange", height=2, width=20).pack(side=LEFT, padx=20, pady=18)
Button(buttonframe, text='Exit', command=win.destroy, fg="red", height=2, width=20).pack(side=LEFT, padx=20, pady=18)

vc = cv2.VideoCapture()

# create and start the video playing thread
t = threading.Thread(target=play_video)
t.setDaemon(True)
t.start()

win.mainloop()
...