我在编写视频编辑器时再次遇到问题...这是一个在单击按钮导入视频时执行的函数(变量是德语,不要怀疑,请随时询问您是否不明白什么):
global Medien_Importierungen, Maximale_Breite, Maximale_Höhe, Tkinter_Bild
Videopfad = askopenfilename(filetypes =[('Video Files', '*.mp4')])
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:
Thumbnail.place(x = Fenster.winfo_screenwidth() * 0.01 + Maximale_Breite / 2 - Einzelbild.shape[1] / 2, y = Fenster.winfo_screenheight() / 10 + (Fenster.winfo_screenwidth() * 0.01 + Maximale_Höhe) * int(Medien_Importierungen / 2) + Maximale_Höhe / 2 - Einzelbild.shape[0] / 2)
else:
Thumbnail.place(x = Fenster.winfo_screenwidth() * 0.11 + Maximale_Breite / 2 - Einzelbild.shape[1] / 2, y = Fenster.winfo_screenheight() / 10 + (Fenster.winfo_screenwidth() * 0.01 + Maximale_Höhe) * int(Medien_Importierungen / 2) + Maximale_Höhe / 2 - Einzelbild.shape[0] / 2)
Medien_Importierungen += 1
现在每次我第一次导入视频时都会显示视频的第一帧,但是当我第二次执行该功能时,第一次的图片将是白色的,并且只会显示第二个视频的第一帧。每次我导入视频时都会重复这个问题,我不知道如何解决这个问题......
我尝试在 if-else 条件下创建整个标签,但这也不起作用......
这是因为相同的全局变量
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
...