2014-06-05 26 views
6

Đang cố gắng thiết lập nền cho cửa sổ tkinter của tôi. Tôi có một hình nền vuông, hình thành màu đen xung quanh các cạnh, và sau đó cửa sổ chính có nền đen. Hình ảnh được đặt trên nền và nếu cửa sổ rộng hơn chiều cao, hình ảnh sẽ tập trung vào chính giữa nền đen và tất cả trông rất đẹp.Tkinter thay đổi kích thước hình nền thành kích thước cửa sổ (Python 3.4)

Tuy nhiên khi cửa sổ nhỏ hơn chiều rộng và chiều cao hình ảnh, nó đặt trung tâm của hình ảnh ở giữa cửa sổ, vì vậy bạn không thấy toàn bộ hình ảnh và có vẻ hơi lạ. Có cách nào để thay đổi kích thước hình ảnh sao cho nếu chiều rộng lớn nhất và chiều cao của cửa sổ nhỏ hơn hình ảnh, hình ảnh được điều chỉnh theo kích thước đó, giữ tỷ lệ cỡ ảnh.

Vì vậy, nói hình nền là 600x600:

  • Trong cửa sổ 800x400, hình ảnh không thay đổi kích thước, và các trung tâm riêng của mình theo chiều dọc.
  • Trong cửa sổ 500x400, hình ảnh đổi kích thước thành 500x500 và vẫn xoay tâm theo chiều dọc.
  • Trong cửa sổ 400x900, hình ảnh không thay đổi kích thước và tự xoay tâm theo chiều ngang.

Chức năng định tâm đã có sẵn, tôi chỉ cần chức năng thay đổi kích thước.

Hiện nay những gì tôi có là:

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

Không chắc chắn nếu có một cách để làm điều này trong Tkinter? Hoặc nếu có lẽ tôi sẽ viết chức năng của riêng tôi mà thay đổi kích thước hình ảnh theo kích thước cửa sổ, tuy nhiên hình ảnh cần phải thay đổi kích thước tương đối thuận lợi và nhanh chóng nếu người dùng thay đổi kích thước cửa sổ tại bất kỳ điểm nào.

+0

Sử dụng [gối] (http://pillow.readthedocs.org/en/latest/) để thay đổi kích thước hình ảnh. – Marcin

Trả lời

10

Đây là ví dụ ứng dụng sử dụng nhiều loại gối để thay đổi kích thước hình ảnh trên nhãn như nhãn thay đổi kích thước:

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

Đây là cách nó hoạt động sử dụng Lenna hình ảnh làm ví dụ:

enter image description here

+2

bạn có thể [bỏ qua thay đổi kích thước cho một số sự kiện, xem phương thức 'fit_image()'] (https://gist.github.com/zed/8b05c3ea0302f0e2c14c#file-slideshow-py-L47) – jfs

4

Tôi đã sửa đổi mã ở trên để nó không nằm trong một lớp học

#!/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() 
Các vấn đề liên quan