首页 > 解决方案 > 在 Python 中全屏显示图像

问题描述

以下程序适用于目录中的第一个 .jpg。当第二次调用它得到一个“_tkinter.TclError:图像“pyimage2”不存在”异常。为什么会出现错误?有没有办法重用第一个图像而不是创建第二个图像?

import sys, os if sys.version_info[0] == 2:
import Tkinter tkinter = Tkinter else: import tkinter from PIL import Image, ImageTk

def showPIL(pilImage):
    root = tkinter.Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    root.focus_set()
    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))
    canvas = tkinter.Canvas(root,width=w,height=h)
    canvas.pack()
    canvas.configure(background='black')
    imgWidth, imgHeight = pilImage.size
 # resize photo to full screen 
    ratio = min(w/imgWidth, h/imgHeight)
    imgWidth = int(imgWidth*ratio)
    imgHeight = int(imgHeight*ratio)
    pilImage = pilImage.resize((imgWidth,imgHeight), Image.ANTIALIAS)   
    image = ImageTk.PhotoImage(pilImage)
    print(image)
    imagesprite = canvas.create_image(w/2,h/2,image=image)
    root.mainloop()

names = os.listdir("E://Users//scott//Pictures")
print(names)
for file in names:
    print(file)
    if file[-4:] == ".jpg":
        file=Image.open("E://Users//scott//Pictures//"+file)
        showPIL(file)

这是控制台输出。Traceback(最近一次调用最后):文件“e:\Users\scott\Documents\Python\image test.py”,第 36 行,在 showPIL(file) 文件“e:\Users\scott\Documents\Python\image test .py”,第 27 行,在 showPIL imagesprite = canvas.create_image(w/2,h/2,image=image) 文件“C:\Program Files\Python37\lib\tkinter__init__.py”,第 2486 行,在 create_image 返回self._create('image', args, kw) 文件“C:\Program Files\Python37\lib\tkinter__init__.py”,第 2477 行,在 _create *(args + self._options(cnf, kw)))) _tkinter .TclError:图像“pyimage2”不存在

>

标签: python-3.xtkinterpython-imaging-library

解决方案


在四处搜索之后,我发现 tkinter.Tk() 被多次调用的第一个问题,而它只能被调用一次,所以我将它移出 showPIL 函数并进入初始化。下一个问题是 mainloop 阻塞,所以我将它替换为 root.update_idletasks() 和 root.update() 的组合。以下工作符合我的期望和需要:

import sys, os
if sys.version_info[0] == 2:  # the tkinter library changed it's name from Python 2 to 3.
    import Tkinter
    tkinter = Tkinter #I decided to use a library reference to avoid potential naming conflicts with people's programs.
else:
    import tkinter
from PIL import Image, ImageTk
import time

root = tkinter.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.overrideredirect(1)
root.geometry("%dx%d+0+0" % (w, h))
root.focus_set()
canvas = tkinter.Canvas(root,width=w,height=h)
canvas.pack()
canvas.configure(background='black')


def showPIL(pilImage):
    imgWidth, imgHeight = pilImage.size
 # resize photo to full screen 
    ratio = min(w/imgWidth, h/imgHeight)
    imgWidth = int(imgWidth*ratio)
    imgHeight = int(imgHeight*ratio)
    pilImage = pilImage.resize((imgWidth,imgHeight), Image.ANTIALIAS)   
    image = ImageTk.PhotoImage(pilImage)
    imagesprite = canvas.create_image(w/2,h/2,image=image)
    root.update_idletasks()
    root.update()
#    root.bind("<Escape>", lambda e: (e.widget.withdraw(), e.widget.quit()))


names = os.listdir("E://Users//scott//Pictures")
print(names)
for file in names:

    print(file)
    if file[-4:] == ".jpg":
        file=Image.open("E://Users//scott//Pictures//"+file)
        showPIL(file)

        time.sleep(5)

推荐阅读