0

我的目标是设置一个循环的背景图像,其功能与 .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()
4

0 回答 0