我的目标是设置一个循环的背景图像,其功能与 .gif 完全一样,最重要的是,让图像幻灯片同时循环播放,延迟约 1 秒。
最初,当我的幻灯片只有 150-200 张图片时,在启动时使用以下代码并处理轻微延迟是没有问题的。
my_photoimage_list = [(PhotoImage(file=image))
for image in imagelist]
但是,一旦我导入了剩余的数千张图像,我就会收到内存不足的错误。我可以使用以下代码解决这个问题,但我遇到了一个小错误,即 gif 背景在等待图像加载时会暂时停止加载。
我的问题是这个;当我的前景图像在数千张图像中循环时,如何保持我的背景图像以常规速度更新?下面的代码几乎完成了这项任务,减去了加载较大图像尺寸时的轻微延迟。
from tkinter import *
from itertools import cycle
from glob import glob
from random import shuffle
class MyTkinterFrame(Frame):
def __init__(self, master, image_files):
self.master = master
self.x_center = int(self.master.winfo_screenwidth()*.5)
self.y_center = int(self.master.winfo_screenheight()*.5)
self.bg = Canvas(self.master)
self.bg.pack(fill=BOTH, expand=YES)
self.make_gif()
self.make_picture(image_files)
self.updatepicture()
self.updategif()
def make_gif(self):
imagelist = glob('Images/My Tkinter Background/*.gif', recursive=True)
self.giflist = [(PhotoImage(file=image))
for image in imagelist]
self.gifcycle = cycle(self.giflist)
self.bg_image=next(self.gifcycle)
self.bg.gif_create = self.bg.create_image(self.x_center, self.y_center, image=self.bg_image)
def make_picture(self,image_files):
self.image_files = cycle(image_files)
self.slides = PhotoImage(file=next(self.image_files))
self.img_object = self.slides
self.bg.fg = self.bg.create_image(self.x_center, self.y_center, image=self.img_object)
def updatepicture(self): #this function loops to update foreground image
self.img_object = self.slides
self.bg.itemconfig(self.bg.fg, image=self.img_object)
self.slides = PhotoImage(file=next(self.image_files))
#for more pronounced error effect, lower delay(500) to 100
self.master.after(500, self.updatepicture)
def updategif(self): #this function loops to update background image
self.bg_image=next(self.gifcycle)
self.bg.itemconfig(self.bg.gif_create, image = self.bg_image)
self.master.after(25, self.updategif)
if __name__ == '__main__':
#this bit makes it pretty and easier to diagnose
root = Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.geometry('%dx%d' % (width, height))
root.configure(background="#000000")
#end
#find foreground images
image_files = glob('Images/My Tkinter Foreground/*.png', recursive=True)
shuffle(image_files)
e = MyTkinterFrame(root, image_files)
root.mainloop()