使用Python 2的全屏幻灯片

时间:2018-06-27 15:41:20

标签: python tkinter slideshow fullscreen

当前,我的代码可以循环显示图像列表,并且可以在一定时间内显示每个图像。但是,它只打开一个小窗口来显示图像,甚至不填满整个窗口。我想全屏显示每个图像,有什么方法可以做到这一点?

此外,该脚本仅适用于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()

2 个答案:

答案 0 :(得分:0)

我的示例使用的是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()

答案 1 :(得分:0)

如果我想按下按钮继续前进?

Tkinter.Button(frame, text='Previous picture', command=lambda: move(-1)).pack(side=Tkinter.LEFT)
Tkinter.Button(frame, text='Next picture', command=lambda: move(+1)).pack(side=Tkinter.LEFT)
Tkinter.Button(frame, text='Quit', command=root.quit).pack(side=Tkinter.LEFT)