Динамически изменить размер двух панелей в tkinter - PullRequest
0 голосов
/ 30 апреля 2019

Я установил 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 Ответ

1 голос
/ 01 мая 2019

Когда вы используете 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 из размера изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...