Tkinter Photoimage останавливает self.after () - PullRequest
0 голосов
/ 14 декабря 2018

Моя цель состоит в том, чтобы установить циклическое фоновое изображение, функционирующее точно так, как это делает .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()
...