我在一个框架中设置了2个面板,
frameA = Frame(master)
frameA.pack(side=LEFT, fill=BOTH, expand=YES)
frameB = Frame(master)
frameB.pack(side=RIGHT, fill=BOTH, expand=YES)
recale = 0.4
self.img = ImageTk.PhotoImage(img.resize((int(rescale*width), int(recale*height)), Image.ANTIALIAS)
self.panelA = Label(frameA, image=self.img)
self.pabelA.pack(side=LEFT, fill=BOTH, expand=YES)
self.panelB = Label(frameB, image=self.img)
self.pabelB.pack(side=LEFT, fill=BOTH, expand=YES)
现在,这2个面板的大小取决于我将图像大小调整为原始大小0.4
倍的图像大小。我如何动态设置rescale
以便当我按下最大化按钮(这不是我制作的按钮,而是下一个小方形按钮)时,每个面板的宽度占据主框架的整个宽度最小化并在GUI上右上角关闭)?
答案 0 :(得分:1)
使用pack(fill=BOTH, expand=YES)
时,tkinter会自动调整Frame
和Label
的大小以适合窗口-因此您不必手动调整大小。但是它永远不会调整PhotoImage
和Image
的大小,因此看起来好像不会调整Label
和Frame
的大小。因此,您真正的问题可能是“如何在更改窗口大小时调整图像大小”
使用
root.bind('<Configure>', on_resize)
您可以在窗口更改大小时运行功能,然后可以生成新图像并替换为Label
该函数不仅会在窗口中执行,还会在窗口中的每个小部件上执行,因此我仅在对窗口执行时使用str(event.widget) == '.'
来调整其大小。
import tkinter as tk
from PIL import Image, ImageTk
def on_resize(event):
global rescaled_img
global photo
#print('[DEBUG] on_resize:', event.widget)
# resize only when root window changes size
if str(event.widget) == '.':
# generate new image
width = event.width//2 # -2 # -2*border
height = event.height # -2 # -2*border
rescaled_img = original_img.resize((width, height), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(rescaled_img)
# replace images in labels
label_left['image'] = photo
label_right['image'] = photo
# ---- main ---
# resize at start
original_img = Image.open('image.jpg')
rescale = 0.4
width = int(rescale * original_img.width)
height = int(rescale * original_img.height)
rescaled_img = original_img.resize((width, height), Image.ANTIALIAS)
root = tk.Tk()
photo = ImageTk.PhotoImage(rescaled_img)
label_left = tk.Label(root, image=photo, border=0) # if border > 0 then you have to use `-2*border` in on_resize
label_left.pack(side='left', fill='both', expand=True)
label_right = tk.Label(root, image=photo, border=0) # if border > 0 then you have to use `-2*border` in on_resize
label_right.pack(side='left', fill='both', expand=True)
# resize when window changed size
root.bind('<Configure>', on_resize)
root.mainloop()
正如您在Tkinter resize background image to window size中的某些代码中所看到的那样,我试图绑定到label
,但是它无法正常工作-开始时它会使图像越来越大,直到窗口填满整个屏幕。或一开始它会使图像越来越小,直到窗口没有尺寸为止。
如果Label
的边框大于0,则必须从图像尺寸中减去2*border
。