Как убрать видео в приложениях Tkinter Python? - PullRequest
1 голос
/ 05 октября 2019

Я создал приложения для отображения видео от Tkinter и Python. Я могу воспроизводить, приостанавливать видео в приложении, и проблема в том, что я хочу удалить видео из моего приложения. Я пробовал много решений, но это не может быть удалено. Код для отображения видео в моем приложении:

def load_vid(path):
    global stop
    global frame_image
    global vlabel
    video = imageio.get_reader(path)
    frame = 0
    stop = Button(tab1, text="Stop",command=stop)
    stop.place(x=350,y=370,anchor="e")
    for image in video.iter_data():
        frame += 1
        image_frame = PIL.Image.fromarray(image)
        image_frame.thumbnail((500,500))
        try:
            frame_image = ImageTk.PhotoImage(image_frame)
            vlabel = Label(tab1,image=frame_image)
            #vlabel.config(image=frame_image)
            vlabel.image = frame_image
            vlabel.place(x=50, y=210, anchor="w")
            if stop == True:
                break
        except:
            sys.exit()

Функция удаления видео:

def stop():
    global stop
    stop = True
    print('stop')
    vlabel.config(image = "")

Я хочуудалить видео из основного кадра приложения. С изображением я могу удалить, используя .config(image =""), но теперь это не работает. Есть ли решение? Спасибо за помощь.

1 Ответ

2 голосов
/ 05 октября 2019

Судя по всему, вы создаете новый Label в каждом кадре вашего видео.

for image in video.iter_data():
    ...
    try:
        ...
        vlabel = Label(tab1,image=frame_image)
        vlabel.place(x=50, y=210, anchor="w")
        ...
    except:
        ...

Там будут сотни Label, которые будут сверху, не зная, и выустановка только последнего созданного Label изображения на None.

Возможно, вам следует начать с создания Label вне цикла и изменять изображение только во время итерации:

def load_vid(path):
    ...
    stop = Button(tab1, text="Stop",command=stop)
    stop.place(x=350,y=370,anchor="e")
    vlabel = Label(tab1)
    vlabel.place(x=50, y=210, anchor="w")
    for image in video.iter_data():
        ...
        try:
            frame_image = ImageTk.PhotoImage(image_frame)
            vlabel.config(image=frame_image)
            vlabel.image = frame_image
            if stop == True:
                break
        except:
            sys.exit()
...