首页 > 解决方案 > 为什么这段代码会使 Tkinter 窗口不断地自动调整大小/增长?

问题描述

它应该使图像标签随窗口调整大小,但整个窗口(连同图像)都会根据自己的想法调整大小。

import tkinter as tk

root = tk.Tk()

canvas = tk.Canvas(root, height=500, width=500)
canvas.pack()

from PIL import Image, ImageTk

def resize_image(event):
    new_width = event.width
    new_height = event.height
    image = copy_of_image.resize((new_width, new_height))
    photo = ImageTk.PhotoImage(image)
    label.configure(image = photo)
    label.image = photo

image = Image.open("*file path to image*")
copy_of_image = image.copy()
photo = ImageTk.PhotoImage(image)
label = tk.Label(canvas, image=photo)
label.bind('<Configure>', resize_image)
label.pack(fill='both', expand='yes')

root.mainloop()

标签: pythontkintercallbackpython-imaging-librarytkinter-canvas

解决方案


每当小部件更改大小时,您都会调用一个函数。在该函数中,您将图像的大小调整为标签的大小。但是,图像周围可能有边框或填充,因此这会导致标签略微增长。因为标签增长,它触发了<Configure>再次调整图像大小的事件,这导致标签改变大小,这触发了<Configure>再次调整图像大小的事件,这导致标签改变大小,......

解决方案是确保borderwidth 和highlightthickness 为零,和/或将图像调整为比标签小几个像素,这样您就不会强制标签增长。


推荐阅读