在Tkinter中动态调整两个面板的大小

时间:2019-04-30 16:07:12

标签: python tkinter

我在一个框架中设置了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上右上角关闭)?

1 个答案:

答案 0 :(得分:1)

使用pack(fill=BOTH, expand=YES)时,tkinter会自动调整FrameLabel的大小以适合窗口-因此您不必手动调整大小。但是它永远不会调整PhotoImageImage的大小,因此看起来好像不会调整LabelFrame的大小。因此,您真正的问题可能是“如何在更改窗口大小时调整图像大小”

使用

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