2013-06-27 26 views
4

我试图在使用PIL的Tkinter中显示图片。正如前面的问题所建议的,我为此使用标签:Tkinter&PIL调整图像以适应标签

from Tkinter import * 

class App(Frame): 
    def __init__(self,master): 
     Frame.__init__(self,master) 
     self.grid(row=0) 
     self.columnconfigure(0,weight=1) 
     self.rowconfigure(0,weight=1) 
     image = Image.load('example.png') 
     image = ImageTk.PhotoImage(image.convert('RGBA')) 
     self.display = Label(self,image=image) 
     self.display.grid(row=0) 

root = Tk() 
app = App(root) 
app.mainloop() 
root.destroy() 

有没有办法调整图像的大小以适应标签?例如,如果exam​​ple.png为2000x1000,但窗口只有800x600,则只显示图像的一部分。

回答

9

如果你知道你想要的大小,使用PIL来调整图像大小:

class App(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.grid(row=0) 
     self.columnconfigure(0,weight=1) 
     self.rowconfigure(0,weight=1) 
     self.original = Image.open('example.png') 
     resized = self.original.resize((800, 600),Image.ANTIALIAS) 
     self.image = ImageTk.PhotoImage(resized) # Keep a reference, prevent GC 
     self.display = Label(self, image = self.image) 
     self.display.grid(row=0) 

你也可以使用一个画布上显示的图像,我喜欢它更多:

from Tkinter import * 
from PIL import Image, ImageTk 

class App(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.columnconfigure(0,weight=1) 
     self.rowconfigure(0,weight=1) 
     self.original = Image.open('example.png') 
     self.image = ImageTk.PhotoImage(self.original) 
     self.display = Canvas(self, bd=0, highlightthickness=0) 
     self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG") 
     self.display.grid(row=0, sticky=W+E+N+S) 
     self.pack(fill=BOTH, expand=1) 
     self.bind("<Configure>", self.resize) 

    def resize(self, event): 
     size = (event.width, event.height) 
     resized = self.original.resize(size,Image.ANTIALIAS) 
     self.image = ImageTk.PhotoImage(resized) 
     self.display.delete("IMG") 
     self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG") 

root = Tk() 
app = App(root) 
app.mainloop() 
root.destroy() 
+0

对不起回复缓慢,我不在。有没有办法找出标签本身的大小? – DoctorSelar