树莓派3 B+幻灯片程序故障求助:Python3代码修复
解决Raspberry Pi幻灯片脚本的StopIteration错误
嘿,我来帮你搞定这个问题!你遇到的StopIteration错误,本质是因为你的图片列表是空的——当itertools.cycle处理一个空列表时,调用next()就会抛出这个异常。咱们来一步步拆解问题:
问题根源在哪?
看你代码的最后执行部分:
if __name__ == "__main__": slide_interval = 2500 # use a list images = [ "/~/definitely/1550099164562.png", "/~/definitely/1550770995551.png", "/~/definitely/1550771217013.png", "/~/definitely/1550771726391.jpg"] # all the specified file types in a directory # "." us the directory the script is in. # exts is the file extentions to use. it can be any extention that pillow supports import glob images = glob.glob("*.jpg") path = "." exts = ["jpg", "bmp", "png", "gif", "jpeg"] images = [fn for fn in os.listdir(path) if any(fn.endswith(ext) for ext in exts)] # start the slideshow slideshow = Slideshow(images, slide_interval) slideshow.start()
你一开始手动定义了images列表,但后面连续三次重新赋值了这个变量:
- 用
glob.glob("*.jpg")覆盖,查找当前目录的jpg文件 - 最后又用列表推导式从当前目录(
path=".")筛选符合后缀的文件,再次完全覆盖
如果你的脚本所在目录里没有这些格式的图片,或者你手动写的图片路径根本没被用到,最终images就变成了空列表,自然会触发StopIteration。另外,你写的"/~/definitely/..."路径也有问题——Python不会自动解析~为用户主目录,得用os.path.expanduser()来处理。
解决方案
根据你的需求,选下面其中一种方式修改:
方式1:保留手动指定的图片列表
删掉后面覆盖images的代码,同时修正路径解析:
if __name__ == "__main__": slide_interval = 2500 # 处理~路径,替换成实际的用户目录 import os images = [ os.path.expanduser("~/definitely/1550099164562.png"), os.path.expanduser("~/definitely/1550770995551.png"), os.path.expanduser("~/definitely/1550771217013.png"), os.path.expanduser("~/definitely/1550771726391.jpg") ] # 删掉后面覆盖images的glob和os.listdir代码! # start the slideshow slideshow = Slideshow(images, slide_interval) slideshow.start()
方式2:自动加载指定目录下的所有图片
如果你想自动加载某个目录的图片,确保path是正确的目录路径,并且不要覆盖之前的代码:
if __name__ == "__main__": slide_interval = 2500 # 指定你的图片目录,比如替换成"/home/pi/definitely" path = os.path.expanduser("~/definitely") exts = ["jpg", "bmp", "png", "gif", "jpeg"] # 生成完整的图片路径,避免只拿文件名导致找不到文件 images = [os.path.join(path, fn) for fn in os.listdir(path) if any(fn.endswith(ext) for ext in exts)] # 先检查列表是否为空,提前避免报错 if not images: print("错误:指定目录里没有找到符合格式的图片!") exit(1) # start the slideshow slideshow = Slideshow(images, slide_interval) slideshow.start()
另外,建议在set_image方法里加个小检查,增强鲁棒性:
def set_image(self): """Setup image to be displayed""" try: self.image_name = next(self.images) except StopIteration: # 如果图片列表空了,就退出程序 self.quit() return filename, ext = os.path.splitext(self.image_name) self.image = ImageTk.PhotoImage(Image.open(self.image_name))
这样就能解决你的问题啦!
内容的提问来源于stack exchange,提问作者achapira
相关产品推荐
相关产品推荐

