Python 无法在tkinter中调整图片大小

Python 无法在tkinter中调整图片大小,python,tkinter,Python,Tkinter,我在tkinter窗口的一个文件夹中找到了几个循环的图像。但是,每个图像都有不同的大小,我无法在代码中调整它们的大小 import tkinter as tk import glob root = tk.Tk() root.geometry('600x600') pics = glob.glob("./Images/*.png") photos = [tk.PhotoImage.resize(20,20)(file=x) for x in pics] label = tk.

我在tkinter窗口的一个文件夹中找到了几个循环的图像。但是,每个图像都有不同的大小,我无法在代码中调整它们的大小

import tkinter as tk
import glob
root = tk.Tk()
root.geometry('600x600')

pics = glob.glob("./Images/*.png")
photos = [tk.PhotoImage.resize(20,20)(file=x) for x in pics]
label = tk.Label()
label.photos = photos
label.counter = 0
def cimage():
    label['image'] = label.photos[label.counter%len(label.photos)]
    label.after(3000, cimage)
    label.counter += 1
label.pack()
cimage()

root.mainloop()
版本2:还尝试了以下操作,但得到了相同的错误:

import tkinter as tk
import glob
from PIL import Image, ImageTk
root = tk.Tk()
root.geometry('600x600')

pics = glob.glob("./Images/*.png")
photos=pics.resize((20,20),Image.ANTIALIAS)
photosresized = [tk.PhotoImage(file=x) for x in photos]
label = tk.Label()
label.photosresized = photosresized
label.counter = 0
def changeimage():
    label['image'] = label.photosresized[label.counter%len(label.photosresized)]
    label.after(3000, changeimage)
    label.counter += 1
label.pack()
changeimage()

root.mainloop()
回溯:

Traceback (most recent call last):
  File "/Users/ad/Documents/Python/Project_tkinter/test1.py", line 85, in <module>
    photos = [tk.PhotoImage.resize(20,20)(file=x) for x in pics]
  File "/Users/ad/Documents/Python/Project_tkinter/test1.py", line 85, in <listcomp>
    photos = [tk.PhotoImage.resize(20,20)(file=x) for x in pics]
AttributeError: type object 'PhotoImage' has no attribute 'resize'

应使用
PIL.Image.resize()
函数调整图像大小:

import glob
import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.geometry('600x600')

label = tk.Label()
label.pack()

label.counter = 0

pics = glob.glob("./Images/*.png")
label.photosresized = [ImageTk.PhotoImage(Image.open(x).resize((20,20),Image.ANTIALIAS)) for x in pics]

def changeimage():
    label['image'] = label.photosresized[label.counter%len(label.photosresized)]
    label.counter += 1
    label.after(3000, changeimage)

changeimage()

root.mainloop()

应使用
PIL.Image.resize()
函数调整图像大小:

import glob
import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()
root.geometry('600x600')

label = tk.Label()
label.pack()

label.counter = 0

pics = glob.glob("./Images/*.png")
label.photosresized = [ImageTk.PhotoImage(Image.open(x).resize((20,20),Image.ANTIALIAS)) for x in pics]

def changeimage():
    label['image'] = label.photosresized[label.counter%len(label.photosresized)]
    label.counter += 1
    label.after(3000, changeimage)

changeimage()

root.mainloop()

所以glob.glob会给你一个文件名列表,所以你必须用类似“pics[0]”的东西来访问它,但这也会给你文件名,而不是实际的图像。 在播放图像之前,您需要将图像实际加载到活动内存中:

import tkinter as tk
import glob
from PIL import Image, ImageTk
root = tk.Tk()
root.geometry('600x600')

pics = glob.glob("./Images/*.png")
photosresized = []
for i in pics:
    single_image = Image.open(i)
    changed_size = single_image.resize((20,20),Image.ANTIALIAS)
    pid = ImageTk.PhotoImage(single_image.resize((20,20),Image.ANTIALIAS))
    photosresized.append(pid)
label = tk.Label()
label.photosresized = photosresized
label.counter = 0
def changeimage():
    label['image'] = label.photosresized[label.counter%len(label.photosresized)]
    label.after(3000, changeimage)
    label.counter += 1
label.pack()
changeimage()

root.mainloop()
这不会以任何方式更改实际文件。它使用“Image.open”一次加载每个对象,然后调整它们的大小,并将它们保存到“PhotoResized”列表中,以便在动画中使用


还请注意,我将tk.PhotoImage更改为ImageTk.PhotoImage,因为首选使用PIL。因此glob.glob会提供文件名列表,因此您必须使用类似“pics[0]”的内容访问它,但这也只会提供文件名,而不是实际的图像。 在播放图像之前,您需要将图像实际加载到活动内存中:

import tkinter as tk
import glob
from PIL import Image, ImageTk
root = tk.Tk()
root.geometry('600x600')

pics = glob.glob("./Images/*.png")
photosresized = []
for i in pics:
    single_image = Image.open(i)
    changed_size = single_image.resize((20,20),Image.ANTIALIAS)
    pid = ImageTk.PhotoImage(single_image.resize((20,20),Image.ANTIALIAS))
    photosresized.append(pid)
label = tk.Label()
label.photosresized = photosresized
label.counter = 0
def changeimage():
    label['image'] = label.photosresized[label.counter%len(label.photosresized)]
    label.after(3000, changeimage)
    label.counter += 1
label.pack()
changeimage()

root.mainloop()
这不会以任何方式更改实际文件。它使用“Image.open”一次加载每个对象,然后调整它们的大小,并将它们保存到“PhotoResized”列表中,以便在动画中使用


还请注意,我将tk.PhotoImage更改为ImageTk.PhotoImage,因为首选使用PIL。这是否回答了您的问题@Karthik嘿,尝试了你提供的链接中的示例。请在我的帖子中查看我上面的代码。出现错误:AttributeError:“list”对象没有属性“resize”这是一个有效错误..图片是一个列表,您无法调整列表大小..但您需要调整列表中的内容(即图像)大小。这能回答你的问题吗@Karthik嘿,尝试了你提供的链接中的示例。请在我的帖子中查看我上面的代码。出现错误:AttributeError:“list”对象没有属性“resize”这是一个有效错误..图片是一个列表,您无法调整列表大小..但您需要调整列表中的内容(即图像)大小。谢谢你,太棒了!非常感谢。我有没有办法只改变图片的高度而不改变已经存在的宽度?一旦你有了图片——就像我们有“single_image”时一样——你可以使用.size来获得宽度和高度的元组。所以像
width,height=single_image.size
这样的东西可以让你把宽度作为一个变量,然后在你的尺寸调整行中使用它。明白了!用更改更新了我原来的帖子。谢谢明亮的非常感谢。我有没有办法只改变图片的高度而不改变已经存在的宽度?一旦你有了图片——就像我们有“single_image”时一样——你可以使用.size来获得宽度和高度的元组。所以像
width,height=single_image.size
这样的东西可以让你把宽度作为一个变量,然后在你的尺寸调整行中使用它。明白了!用更改更新了我原来的帖子。谢谢