Tkinter redimensionar imagen de fondo a tamaño de ventana

Tratando de configurar un fondo para mi ventana tkinter. Tengo una imagen de fondo cuadrada, que se desvanece en negro alrededor de los bordes, y luego la ventana principal tiene un fondo negro. La imagen se coloca sobre el fondo, y si la ventana es más ancha que alta, la imagen se centra en el centro sobre el fondo negro, y todo se ve muy bien.

Sin embargo, cuando la ventana es más pequeña que el ancho y alto de la imagen, coloca el centro de la imagen en el centro de la ventana, por lo que no se ve toda la imagen y se ve un poco extraño. ¿Hay una manera de cambiar el tamaño de la imagen de modo que si el ancho y el alto de la ventana es más pequeño que la imagen, la imagen se ajusta a ese tamaño, manteniendo la relación de aspecto.

Así que digamos que la imagen de fondo es 600x600 :

  • En una ventana de 800x400 , la imagen no 800x400 tamaño y se centra verticalmente.
  • En una ventana de 500x400 , la imagen cambia de tamaño a 500x500 , y aún se centra verticalmente.
  • En una ventana de 400x900 , la imagen no 400x900 tamaño y se centra horizontalmente.

La funcionalidad de centrado ya está ahí, solo necesito la funcionalidad de cambio de tamaño.

Actualmente lo que tengo es:

 from tkinter import * root = Tk() root.title("Title") root.geometry("600x600") root.configure(background="black") background_image = PhotoImage(file="Background.gif") background = Label(root, image=background_image, bd=0) background.pack() root.mainloop() 

¿No está seguro si hay una manera de hacer esto en tkinter? O si tal vez escribiera mi propia función que cambia el tamaño de la imagen según el tamaño de la ventana, sin embargo, la imagen necesita cambiar el tamaño de manera relativamente suave y rápida si el usuario cambia el tamaño de la ventana en cualquier momento.

Esta es una aplicación de ejemplo que utiliza la almohadilla para cambiar el tamaño de la imagen en la etiqueta a medida que la etiqueta cambia de tamaño:

 from tkinter import * from PIL import Image, ImageTk root = Tk() root.title("Title") root.geometry("600x600") root.configure(background="black") class Example(Frame): def __init__(self, master, *pargs): Frame.__init__(self, master, *pargs) self.image = Image.open("./resource/Background.gif") self.img_copy= self.image.copy() self.background_image = ImageTk.PhotoImage(self.image) self.background = Label(self, image=self.background_image) self.background.pack(fill=BOTH, expand=YES) self.background.bind('', self._resize_image) def _resize_image(self,event): new_width = event.width new_height = event.height self.image = self.img_copy.resize((new_width, new_height)) self.background_image = ImageTk.PhotoImage(self.image) self.background.configure(image = self.background_image) e = Example(root) e.pack(fill=BOTH, expand=YES) root.mainloop() 

Así es como funciona usando la imagen de Lenna como ejemplo:

introduzca la descripción de la imagen aquí

He modificado el código anterior para que no esté en una clase

 #!/usr/bin/python3.5 from tkinter import * from tkinter import ttk from PIL import Image, ImageTk root = Tk() root.title("Title") root.geometry('600x600') def resize_image(event): new_width = event.width new_height = event.height image = copy_of_image.resize((new_width, new_height)) photo = ImageTk.PhotoImage(image) label.config(image = photo) label.image = photo #avoid garbage collection image = Image.open('image.gif') copy_of_image = image.copy() photo = ImageTk.PhotoImage(image) label = ttk.Label(root, image = photo) label.bind('', resize_image) label.pack(fill=BOTH, expand = YES) root.mainloop()