python-3.x - 在 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”不存在
>
解决方案
在四处搜索之后,我发现 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)
推荐阅读
- http - 防火墙/代理后面的 Hyperledger Fabric
- perl - 在 Mac OSX 上使用 libevent 安装 Event::Lib 时出现问题
- python - Visual Basic NET 无法连接到 TLS 1.2 Web 服务器
- java - Java 优先队列问题
- tensorflow - 持续训练验证准确性问题
- excel-formula - 有没有办法从行听到和行值中查找列标题?
- r - 在数据框中查找重复项并更改识别值
- python - 如果通过验证,AWS lambda 读取 zip 文件执行验证并解压缩到 s3 存储桶
- go - 使用具有典型目录结构的 go 模块,似乎无法正常工作
- javascript - res.redirect() 没有将我重定向到任何页面,没有错误,有人可以解释这里发生了什么吗?