Изменение размера изображения без нарушения макета в tkinter - PullRequest
0 голосов
/ 16 января 2020

Хорошо, у меня проблема, и я слишком долго пытался ее исправить. Я не знаю, как изменить размер изображения, не нарушая его макет. В случае (1) он заполняет все пространство, таким образом разрушая мой макет, и я думаю, что это потому, что я вызываю функцию configure в функции, которая связана с событием <Configure>. В случае (2) я могу изменить размер изображения, но у меня есть огромная граница вокруг масштабированного изображения, которая разрушает макет. Я даже пытался использовать Canvas вместо Label, но просто рисование Canvas разрушает макет, потому что он занимает слишком много места и сдвигает все вправо.

Идеи, как исправить это?

from tkinter import *
from PIL import ImageTk, Image

global image_label, image_ref

def main():
    global image_label
    root = Tk()
    root.geometry("600x400")

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    content_frame = Frame(root, bg="#FF0000")
    content_frame.grid(row=0, column=0, sticky="news")

    column_ratio = [10,25,10,45,10]
    row_ratio = [10,80,10]
    for col_idx in range(5):
        content_frame.grid_columnconfigure(col_idx, weight=column_ratio[col_idx])
    for row_idx in range(3):
        content_frame.grid_rowconfigure(row_idx, weight=row_ratio[row_idx])

    image_label = Label(content_frame, bg="#00FF00")
    image_label.grid(row=1, column=1, sticky="news")
    #image_label.bind("<Configure>", resize_configure)  # <--- (1)

    second_label = Label(content_frame, bg="#0000FF", text="Label on the right")
    second_label.grid(row=1, column=3, sticky="news")
    second_label.bind("<Button-1>", resize_click)       # <--- (2)


    root.mainloop()

def resize(size, label):
    global image_ref
    image = Image.open("test.png").resize(size, Image.ANTIALIAS)
    image_ref = ImageTk.PhotoImage(image)
    label.configure(image=image_ref)

def resize_configure(event):
    global image_label
    size = (event.width, event.height)
    resize(size, image_label)

def resize_click(event):
    global image_label
    image_label.update()
    size = (image_label.winfo_width(), image_label.winfo_height())
    resize(size, image_label)



if __name__ == "__main__":
    main()

Случай 1 как изображение

Случай 2 как изображение

Как это должен выглядеть как

1 Ответ

0 голосов
/ 16 января 2020

Вы можете использовать place() вместо grid():

import tkinter as tk
from PIL import Image, ImageTk

base_img = Image.open('test.png')

def on_label_resize(event):
    lbl = event.widget
    img = ImageTk.PhotoImage(base_img.resize((event.width, event.height)))
    lbl.config(image=img)
    lbl.image = img

def main():
    root = tk.Tk()
    root.geometry('640x400')

    img_lbl = tk.Label(root, image=None, bg='#00ff00')
    img_lbl.place(relx=.1, rely=.1, relwidth=.25, relheight=.8)
    img_lbl.bind('<Configure>', on_label_resize)

    txt_lbl = tk.Label(root, text='Label on the right', bg='#0000ff')
    txt_lbl.place(relx=.45, rely=.1, relwidth=.45, relheight=.8)

    root.mainloop()

if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...