У меня снова возникла проблема при кодировании моего видеоредактора... Вот упрощенный код (переменные указаны на немецком языке, не удивляйтесь и не стесняйтесь спрашивать, если вы чего-то не понимаете):
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, но это тоже не сработало...
Не имеет отношения к вашему вопросу, но я считаю, что имеет смысл использовать английские имена переменных, задавая вопрос на английском форуме.
@TheLizzard Я сделал это, потому что «master=Medien» не работал. В этом примере мне нужно было использовать cv2 и pil, потому что я не мог сделать это без этих модулей...
@oskar Я знаю, но больших немецких форумов не так уж и много, и я не хотел переименовывать все переменные на английском языке... Вот почему я также сказал: «Не стесняйтесь спрашивать», но, возможно, я переименую переменные в своем Следующий вопрос...
Это потому, что та же глобальная переменная 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 также не делает атрибут цветным, но спасибо!
Попробуйте добавить
master=Medien
внутриImageTk.PhotoImage(...)
. Если это не сработает, предоставьте минимально воспроизводимый пример, который мы сможем скопировать/вставить и запустить без каких-либо изменений.