使用 Python 2 的全屏幻灯片
Fullscreen slideshow using Python 2
目前,我的代码可以循环显示图像列表,并且可以将每个图像显示一定的时间。但是,它只打开了一个很小的 window 来显示图像,甚至没有填满整个 window。我想全屏显示每个图像,有什么方法可以做到这一点?
此外,该脚本仅适用于 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()
我的示例使用的是 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()
我是否愿意放置继续前进的按钮?
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)
目前,我的代码可以循环显示图像列表,并且可以将每个图像显示一定的时间。但是,它只打开了一个很小的 window 来显示图像,甚至没有填满整个 window。我想全屏显示每个图像,有什么方法可以做到这一点?
此外,该脚本仅适用于 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()
我的示例使用的是 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()
我是否愿意放置继续前进的按钮?
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)