Почему изображение меняется на белую область?

У меня снова возникла проблема при кодировании моего видеоредактора... Вот упрощенный код (переменные указаны на немецком языке, не удивляйтесь и не стесняйтесь спрашивать, если вы чего-то не понимаете):

from tkinter import *
from tkinter.filedialog import askopenfilename
from PIL import Image, ImageTk
import cv2
Fenster = Tk()
Fenster.geometry(f"{Fenster.winfo_screenwidth()}x{Fenster.winfo_screenheight()}")
Maximale_Breite = int(Fenster.winfo_screenwidth() * 0.08)
Maximale_Höhe = int(Fenster.winfo_screenheight() * 0.08)
Medien_Importierungen = 0
Medien = Canvas(Fenster, width=Fenster.winfo_screenwidth() * 0.2, height=Fenster.winfo_screenheight(),
                highlightbackground = "#dd6800")
Medien.pack(side=LEFT)
Medien_Importieren = Label(Medien, text = "Import media")
Medien_Importieren.place(x=int(Fenster.winfo_screenwidth() / 10 - Medien_Importieren.winfo_reqwidth() / 2),
                         y=Fenster.winfo_screenheight() / 20)
def Medien_Hinzufügen(event):
    global Medien_Importierungen, Maximale_Breite, Maximale_Höhe, Tkinter_Bild
    Videopfad = askopenfilename(filetypes=[('Video Files', '*.mp4')])
    if Videopfad:
        Geladenes_Video = cv2.VideoCapture(Videopfad)
        Rückgabe, Einzelbild = Geladenes_Video.read()
        if Einzelbild.shape[0] / Maximale_Höhe > Einzelbild.shape[1] / Maximale_Breite:
            height = Maximale_Höhe
            width = int(Einzelbild.shape[1] * height / Einzelbild.shape[0])
        else:
            width = Maximale_Breite
            height = int(Einzelbild.shape[0] * width / Einzelbild.shape[1])
        Einzelbild = cv2.resize(Einzelbild, (width, height))
        Tkinter_Bild = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(Einzelbild, cv2.COLOR_BGR2RGB)))
        Thumbnail = Label(Medien, image=Tkinter_Bild)
        if Medien_Importierungen % 2 == 0:
            x_position = Fenster.winfo_screenwidth() * 0.01 + Maximale_Breite / 2 - Einzelbild.shape[1] / 2
        else:
            x_position = Fenster.winfo_screenwidth() * 0.11 + Maximale_Breite / 2 - Einzelbild.shape[1] / 2
        y_position = (Fenster.winfo_screenheight() / 10 +
                        (Fenster.winfo_screenwidth() * 0.01 + Maximale_Höhe) * (Medien_Importierungen // 2) +
                        Maximale_Höhe / 2 - Einzelbild.shape[0] / 2)
        Thumbnail.place(x=x_position, y=y_position)
        Medien_Importierungen += 1
Medien_Importieren.bind("<Button-1>", Medien_Hinzufügen)
mainloop()

«Medien_Hinzufügen(x)» — это функция, которая будет выполняться при нажатии кнопки для импорта видео. Теперь каждый раз, когда я импортирую видео в первый раз, он показывает первый кадр видео, но когда я выполняю эту функцию во второй раз, изображение из первого раза будет белым, и будет показан только первый кадр из второго видео. Это повторяется каждый раз, когда я импортирую видео, и я не знаю, как решить эту проблему...

Я попытался создать всю метку в условии if-else, но это тоже не сработало...

Попробуйте добавить master=Medien внутри ImageTk.PhotoImage(...). Если это не сработает, предоставьте минимально воспроизводимый пример, который мы сможем скопировать/вставить и запустить без каких-либо изменений.

TheLizzard 01.08.2024 22:35

Не имеет отношения к вашему вопросу, но я считаю, что имеет смысл использовать английские имена переменных, задавая вопрос на английском форуме.

oskar 01.08.2024 23:09

@TheLizzard Я сделал это, потому что «master=Medien» не работал. В этом примере мне нужно было использовать cv2 и pil, потому что я не мог сделать это без этих модулей...

Alex 02.08.2024 20:16

@oskar Я знаю, но больших немецких форумов не так уж и много, и я не хотел переименовывать все переменные на английском языке... Вот почему я также сказал: «Не стесняйтесь спрашивать», но, возможно, я переименую переменные в своем Следующий вопрос...

Alex 02.08.2024 21:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что та же глобальная переменная Tkinter_Bild используется для хранения ссылок на изображение новой созданной метки, поэтому предыдущая будет удалена сборщиком мусора.

Один из способов сохранить ссылку на изображение — использовать атрибут метки:

...
Tkinter_Bild = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(Einzelbild, cv2.COLOR_BGR2RGB)))
Thumbnail = Label(Medien, image = Tkinter_Bild)
Thumbnail.image = Tkinter_Bild  # keep the reference using an attribute of the label
...

Это сработало... Я не совсем понимаю, почему это так, и мой код Visual Studio также не делает атрибут цветным, но спасибо!

Alex 02.08.2024 21:09

Другие вопросы по теме