web-dev-qa-db-ja.com

Tkinter&PILラベルに合わせて画像のサイズを変更する

PILを使用してTkinterで画像を表示しようとしています。前の質問で提案したように、私はこれにラベルを使用します:

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()

ラベルに合わせて画像のサイズを変更する方法はありますか?たとえば、example.pngが2000x1000でウィンドウが800x600しかない場合、画像の一部のみが表示されます。

11
DoctorSelar

必要なサイズがわかっている場合は、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)

Canvasを使用して画像を表示することもできます。

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()
20
Txema