Когда вы используете pack(fill=BOTH, expand=YES)
, tkinter автоматически изменяет размеры Frame
и Label
, чтобы соответствовать размеру окна, поэтому вам не нужно изменять его размер вручную.Но он никогда не изменит размеры PhotoImage
и Image
, поэтому может показаться, что он не меняет размеры Label
и Frame
.Таким образом, ваша настоящая проблема, вероятно, заключается в том, «как изменить размер изображения при изменении размера окна»
Используя
root.bind('<Configure>', on_resize)
, вы можете запустить функцию, когда размер окна изменился, а затем вы можете сгенерировать новое изображение и заменитьin 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()
Я пытался привязать к label
, как вы можете видеть в некотором коде в Tkinter изменил размер фонового изображения до размера окна , но это не сработало - назапуск делает изображения больше и больше, пока окно не заполнит весь экран.Или при запуске он делает изображения маленькими и маленькими, пока окно не будет иметь размер.
, если Label
имеет границу больше 0, то вы должны вычесть 2*border
из размера изображения.