2014-06-05 16 views
6

Próbuje ustawić tło dla mojego okna tkinter. Mam kwadratowy obraz tła, który zanika w czerni wokół krawędzi, a następnie główne okno ma czarne tło. Obraz jest umieszczony na tle, a jeśli okno jest szersze niż jest wysokie, obraz centruje się pośrodku na czarnym tle i wszystko wygląda bardzo ładnie.Tkinter zmienia rozmiar obrazu tła na rozmiar okna (Python 3.4)

Jednak gdy okno jest mniejsze niż obraz w szerokości i wysokości, umieszcza środek obrazu pośrodku okna, więc nie widać całego obrazu i wygląda trochę dziwnie. Czy istnieje sposób zmiany rozmiaru obrazu, więc jeśli największa szerokość i wysokość okna jest mniejsza niż obraz, obraz jest dostosowywany do tego rozmiaru, zachowując proporcje.

więc powiedzieć, że obraz tła jest 600x600:

  • W oknie 800x400, obraz nie zmiana rozmiaru, a centra sama w pionie.
  • W oknie 500x400 obraz zmienia się na 500x500 i nadal centruje się w pionie.
  • W oknie 400x900 obraz nie zmienia rozmiaru i jest wyśrodkowany w poziomie.

Funkcja centrowania już istnieje, potrzebuję tylko funkcji zmiany rozmiaru.

Obecnie co mam to:

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

Nie wiem, czy istnieje sposób na osiągnięcie tego w Tkinter? A może napisałbym swoją własną funkcję, która zmienia rozmiar obrazu zgodnie z rozmiarem okna, jednak obraz musi zmieniać rozmiar stosunkowo płynnie i szybko, jeśli użytkownik zmieni rozmiar okna w dowolnym momencie.

+0

Użyj [poduszki] (http://pillow.readthedocs.org/en/latest/) do zmiany rozmiaru obrazu. – Marcin

Odpowiedz

10

Jest to przykład aplikacja, która korzysta z Pillow, aby zmienić rozmiar obrazu na etykiecie jako etykieta zmienia rozmiar:

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

Jak to działa przy użyciu Lenna obraz jako przykład:

enter image description here

+2

można [pomijać zmianę rozmiaru dla niektórych zdarzeń, zobacz metodę 'fit_image()'] (https://gist.github.com/zed/8b05c3ea0302f0e2c14c#file-slideshow-py-L47) – jfs

4

Zmodyfikowałem powyższy kod, więc nie należy on do klasy

#!/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() 
Powiązane problemy