2014-06-05 15 views
6

Cercando di impostare uno sfondo per la mia finestra di tkinter. Ho un'immagine di sfondo quadrata, che sfuma in nero attorno ai bordi, e quindi la finestra principale ha uno sfondo nero. L'immagine viene posizionata sullo sfondo e, se la finestra è più larga di quanto non sia alta, l'immagine si centra al centro dello sfondo nero, e tutto sembra molto bello.Tkinter ridimensiona l'immagine di sfondo alla dimensione della finestra (Python 3.4)

Tuttavia, quando la finestra è più piccola dell'immagine in larghezza e altezza, mette il centro dell'immagine al centro della finestra, in modo da non vedere l'intera immagine, e sembra un po 'strano. Esiste un modo per ridimensionare l'immagine in modo che se la larghezza e l'altezza della finestra più grandi rispetto all'immagine, l'immagine viene adattata a tali dimensioni, mantenendo le proporzioni.

Così dicono l'immagine di sfondo è 600x600:

  • In una finestra 800x400, l'immagine non ridimensiona, e si centra verticalmente.
  • In una finestra 500x400, l'immagine viene ridimensionata a 500x500 e continua a centrarsi verticalmente.
  • In una finestra 400x900, l'immagine non viene ridimensionata e si centra orizzontalmente.

La funzionalità di centratura è già lì, ho solo bisogno della funzionalità di ridimensionamento.

Attualmente Quello che ho è:

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() 

Non sono sicuro se c'è un modo di fare questo in tkinter? O se forse scriverei la mia funzione che ridimensiona l'immagine in base alla dimensione della finestra, tuttavia l'immagine deve ridimensionarsi in modo relativamente fluido e rapido se l'utente ridimensiona la finestra in qualsiasi momento.

+0

Usa [cuscino] (http://pillow.readthedocs.org/en/latest/) per ridimensionare le immagini. – Marcin

risposta

10

Questa è esempio di applicazione che utilizza Cuscino per ridimensionare l'immagine sull'etichetta come l'etichetta cambia dimensione:

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('<Configure>', 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() 

Questo è come funziona utilizzando l'immagine Lenna come ad esempio:

enter image description here

+2

si potrebbe [saltare il ridimensionamento per alcuni eventi, si veda il metodo 'fit_image()'] (https://gist.github.com/zed/8b05c3ea0302f0e2c14c#file-slideshow-py-L47) – jfs

4

Ho modificato il codice di cui sopra in modo che non sia in una classe

#!/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('<Configure>', resize_image) 
label.pack(fill=BOTH, expand = YES) 

root.mainloop() 
Problemi correlati