Python 在Tkinter中努力调整图像大小

Python 在Tkinter中努力调整图像大小,python,python-3.x,tkinter,python-imaging-library,Python,Python 3.x,Tkinter,Python Imaging Library,我已经为我的六年级计算机课程开发了一个基于控制台的冒险游戏,现在想把它移植到Tkinter中。主要原因是我可以利用图片,主要是来自中国的图片 到目前为止还不错,但是图像质量非常高,当我显示它们时,它们看起来非常巨大。以下是一个例子: 代码通过使用for循环迭代当前区域(玩家所在区域)中的项目列表来工作。代码如下: if len(itemKeys) > 0: l = Label(lookWindow, text="Looking around, you see the follow

我已经为我的六年级计算机课程开发了一个基于控制台的冒险游戏,现在想把它移植到Tkinter中。主要原因是我可以利用图片,主要是来自中国的图片

到目前为止还不错,但是图像质量非常高,当我显示它们时,它们看起来非常巨大。以下是一个例子:

代码通过使用
for
循环迭代当前区域(玩家所在区域)中的项目列表来工作。代码如下:

if len(itemKeys) > 0:
    l = Label(lookWindow, text="Looking around, you see the following items....\n").pack()
    for x in range(0, len(itemKeys)):
        icon = PhotoImage(file=("icons\\" + itemKeys[x] + ".png"))
        l = Label(lookWindow, image=icon)
        l.photo = icon
        l.pack()
        l = Label(lookWindow, text=("" + itemKeys[x].title())).pack()
        l = Label(lookWindow, text=("   " + locations[position][2][itemKeys[x]][0] + "\n")).pack()

else:
    l = Label(lookWindow, text="There's nothing at this location....").pack()
(“icons\\\”+itemKeys[x]+.png”)
的部分进入游戏目录中的
icons
文件夹,并将一个文件名串在一起,在本例中,这将导致“key.png”,因为我们当前查看的项目是一个键

但是,现在我想调整图像的大小。我尝试过使用PIL(人们说它不受欢迎,但我安装得很好?),但到目前为止运气不佳

谢谢你的帮助。 杰克

编辑: 这个问题被标记为重复,但我已经做了,但是回答的人似乎打开了一个文件,将其保存为“.ppm”(?)文件,然后显示它,但是当我尝试时,我得到一个巨大的错误,即我无法显示“PIL.Image.Image”

编辑2: 将其更改为:

im_temp = PILImage.open(("icons\\" + itemKeys[x] + ".png")).resize((250,250), PILImage.ANTIALIAS)
photo = PhotoImage(file=im_temp)
label = Label(lookWindow, image=photo)
label.photo = photo
label.pack()
现在请看这个:


您可以在将这些巨大图像绑定到应用程序之前对其进行预处理,而不是动态调整它们的大小。我拍摄了“钥匙”和“锁胸”图像,并将它们放在“图标”子目录中,然后运行以下代码:

from PIL import Image
import glob

for infn in glob.glob("icons/*.png"):
    if "-small" in infn: continue
    outfn = infn.replace(".png", "-small.png")
    im = Image.open(infn)
    im.thumbnail((50, 50))
    im.save(outfn)

它创建了一个“key small.png”和“locked chest small.png”,您可以在应用程序中使用它来代替原始图像。

对于Python2,您可以这样做,在导入的一些小更改之后,它也应该适用于Python3

from tkinter import Tk, Label
from PIL import Image, ImageTk

root = Tk()

file = 'plant001.png'

image = Image.open(file)

zoom = 0.5

#multiple image zise by zoom
pixels_x, pixels_y = tuple([int(zoom * x)  for x in image.size])

img = ImageTk.PhotoImage(image.resize((pixels_x, pixels_y))) # the one-liner I used in my app
label = Label(root, image=img)
label.image = img # this feels redundant but the image didn't show up without it in my app
label.pack()

root.mainloop()

原来的PIL不再被维护(并且与Python3、IIRC不兼容)。然而,有一个称为PIL的分支,它可能是您已经安装的。代码中的
PhotoImage()
函数需要PIL/Pillow才能运行,因此,如果您的代码在Python 3上运行,您可以确保您的Pillow安装正常。:)您可以使用枕头
Image.resize
方法来调整图像的大小。@PM2Ring我正在努力找到添加
Image.resize
位的位置。这似乎是我想要的,但我如何调整代码?我尝试将
.resize(0.5)
作为测试添加到打开文件的行的末尾,但我被告知
PhotoImage对象没有属性resize
。显然,这是因为我需要对
图像
对象执行此操作,但如何执行?您必须分阶段执行此操作,如链接中接受的答案所示。首先将文件作为PIL映像加载。然后调整它的大小。然后将调整大小的PIL图像转换为照片图像。一旦你看过我在之前的评论中链接到的PIL/Pillow文档,这可能会更有意义。这些文档并不精彩,但您至少应该了解一下它们的概况,以了解PIL可以做些什么。@PM2Ring试图修改我的代码,请参见上面的编辑2。如果您尝试了一些未成功的内容,您需要说明您这样做了,以及您尝试了什么。最初的问题只是解释了您的程序,在“如何在PIL中调整大小?”的末尾有一点注释。上面链接的重复目标说明了如何实现这一点。我们可以通过代码更改
zoom=zX,zY
image.resize(tuple([x*y代表(x,y)在zip中([x代表x在image.size中,zoom)])将缩放从一维扩展到二维。