Полноэкранное слайд-шоу с использованием Python 2 - PullRequest
0 голосов
/ 27 июня 2018

В настоящее время мой код может циклически перемещаться по списку изображений и отображать каждое изображение в течение определенного промежутка времени. Тем не менее, он открывает только небольшое окно для отображения изображения, которое даже не заполняет все окно. Я хочу, чтобы каждое изображение отображалось в полноэкранном режиме, есть ли способ сделать это?

Кроме того, скрипт работает только для GIF-файлов, есть ли способ изменить его, чтобы он принимал другие типы файлов, такие как JPEG.

Мой код:

from itertools import cycle
import Tkinter as tk

class App(tk.Tk):
    def __init__(self, image_files, delay):
        tk.Tk.__init__(self)
        w, h = self.winfo_screenwidth(), self.winfo_screenheight()
        self.overrideredirect(1)
        self.geometry("%dx%d+0+0" % (w, h))
        self.delay = delay
        self.pictures = cycle((tk.PhotoImage(file=image), image)
                          for image in image_files)            
        self.picture_display = tk.Label(self)
        self.picture_display.pack()

    def show_slides(self):
        img_object, img_name = next(self.pictures)
        self.picture_display.config(image=img_object)
        self.title(img_name)
        self.after(self.delay, self.show_slides)
    def run(self):
        self.mainloop()

 delay = 3500
 image_files = ["/media/pi/RASPBERRY/object1.gif",
     "/media/pi/RASPBERRY/object12ndImage.gif",
     "/media/pi/RASPBERRY/object13rdImage.gif",
     "/media/pi/RASPBERRY/object14thImage.gif"]

 app = App(image_files, delay)
 app.show_slides()
 app.run()

1 Ответ

0 голосов
/ 27 июня 2018

В моем примере используется Python 3.x, однако у вас не должно возникнуть проблем с изменением импорта для работы с Python 2.x.

При этом я бы лично использовал переменную отслеживания для отслеживания индекса нашего списка фотографий. При этом мы можем запустить все, что нам нужно для запуска из show_slides метода. Основная проблема, которую вам нужно решить, это изменение размеров ваших изображений. Это можно сделать с помощью PIL. Мы можем открыть изображение на основе текущего пути, а затем изменить его размер. Затем мы загружаем измененное изображение на этикетку. Мы также можем использовать os.path.basename(), чтобы получить имя файла для наших заголовков. Тем не менее, в настоящее время при настройке вашей программы ни один заголовок не будет смещен на весь экран.

Посмотрите на приведенный ниже код и дайте мне знать, если у вас есть какие-либо вопросы.

from PIL import Image, ImageTk
import tkinter as tk
import os


class App(tk.Tk):
    def __init__(self, image_files, delay):
        tk.Tk.__init__(self)
        self.w = self.winfo_screenwidth()
        self.h = self.winfo_screenheight()
        self.overrideredirect(1)
        self.geometry("%dx%d+0+0" % (self.w, self.h))
        self.delay = delay
        self.pictures = []
        self.track_img_ndex = 0
        for img in image_files:
            self.pictures.append(img)            
        self.picture_display = tk.Label(self)
        self.picture_display.pack(expand=True, fill="both")

    def show_slides(self):
        if self.track_img_ndex < len(self.pictures):
            x = self.pictures[self.track_img_ndex]
            self.track_img_ndex +=1
            original_image = Image.open(x)
            resized = original_image.resize((self.w, self.h),Image.ANTIALIAS)
            new_img = ImageTk.PhotoImage(resized)
            self.picture_display.config(image=new_img)
            self.picture_display.image = new_img
            self.title(os.path.basename(x))
            self.after(self.delay, self.show_slides)
        else:
            print("End of list!")

delay = 3500
image_files = ["/media/pi/RASPBERRY/object1.gif",
     "/media/pi/RASPBERRY/object12ndImage.gif",
     "/media/pi/RASPBERRY/object13rdImage.gif",
     "/media/pi/RASPBERRY/object14thImage.gif"]

app = App(image_files, delay)
app.show_slides()
app.mainloop()
...