#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/04/07 06:45:33 +0900> """ tkinter.PhotoImage zoom sample. * Windows10 x64 21H2 + Python 3.9.12 64bit + Pillow 9.1.0 * Windows10 x64 21H2 + Python 2.7.18 32bit + Pillow 6.2.2 Python 2.7.18 32bit ... Success up to 10x, failure 11x. """ try: import Tkinter as tk except Exception: import tkinter as tk from PIL import Image, ImageTk class App(tk.Frame): def __init__(self, master=None): tk.Frame.__init__(self, master) self.frm = tk.Frame(self.master) self.frm.pack(expand=1, fill=tk.BOTH) self.frm.rowconfigure(1, weight=1) self.frm.columnconfigure(2, weight=1) self.btn0 = tk.Button(self.frm, text="-", command=lambda: self.dec_ratio()) self.btn1 = tk.Button(self.frm, text="+", command=lambda: self.inc_ratio()) self.zoomstr = tk.StringVar() self.zoomlbl = tk.Label(self.frm, textvariable=self.zoomstr) self.btn0.grid(row=0, column=0, ipadx=4) self.btn1.grid(row=0, column=1, ipadx=4) self.zoomlbl.grid(row=0, column=2) self.canvas = tk.Canvas(self.frm, bg="#666666") self.canvas.grid(row=1, column=0, columnspan=3, sticky=tk.N + tk.S + tk.W + tk.E) self.im = Image.open("tex_1024.png") self.photo_image = ImageTk.PhotoImage(image=self.im) self.ratio = 1 self.set_image() def set_image(self): self.canvas.delete("all") if self.ratio == 1: # 1:1 self.zoomstr.set("%d%%" % (self.ratio * 100)) self.zoom_image = self.photo_image elif self.ratio > 1: # zoom (x 2, 3, 4, ...) zm = int(self.ratio) self.zoomstr.set("%d%%" % (self.ratio * 100)) self.zoom_image = self.photo_image._PhotoImage__photo.zoom(zm) else: # subsample (/ 2, 3, 4, ...) zm = -self.ratio r = int(100 / zm) self.zoomstr.set("%d%%" % r) self.zoom_image = self.photo_image._PhotoImage__photo.subsample(zm) self.canvas.create_image(0, 0, image=self.zoom_image, anchor=tk.NW) def inc_ratio(self): maxratio = 16 if self.ratio < maxratio: self.ratio = self.ratio + 1 self.ratio = min([maxratio, self.ratio]) if -1 <= self.ratio <= 1: self.ratio = 1 self.set_image() def dec_ratio(self): minratio = -10 if self.ratio > minratio: self.ratio = self.ratio - 1 self.ratio = max([minratio, self.ratio]) if -1 <= self.ratio <= 0: self.ratio = -2 self.set_image() def main(): root = tk.Tk() app = App(master=root) app.mainloop() if __name__ == '__main__': main()