Я пытаюсь сделать виджет для хранения изображения, которое будет автоматически изменяться в соответствии с его контейнером, например. если он упакован непосредственно в окно, то расширение этого окна расширит изображение.
У меня есть некоторый код, который является полуфункциональным, но мне пришлось добавить пару констант в одну из подпрограмм, чтобы предотвратить автоматическое изменение размера автозапуска (заставляя его продолжать расти в размере)
Я уверен, что причина этого связана с внутренними дополнениями/границами виджетов, но даже пытаясь принять это во внимание, я получаю эту проблему.
Я использую python 3.3.2 и PIL 1.1.7 на 64-битной Windows 7 мой код следующий:
from tkinter import tix
from PIL import Image, ImageTk
def Resize_Image(image, maxsize):
r1 = image.size[0]/maxsize[0] # width ratio
r2 = image.size[1]/maxsize[1] # height ratio
ratio = max(r1, r2)
newsize = (int(image.size[0]/ratio), int(image.size[1]/ratio)) # keep image aspect ratio
image = image.resize(newsize, Image.ANTIALIAS)
return image
class Pict_Frame(tix.Label):
def __init__(self, parent=None, picture=None, maxupdate=None, **kwargs):
tix.Label.__init__(self, parent, **kwargs)
self.bind("<Configure>", self._resize_binding)
self.maxupdate = maxupdate
self.update_after_id = None
self.photo = None
self.image = None
if picture:
self.set_picture(picture)
def _resize_binding(self, event):
if self.photo:
if not self.maxupdate:
self.load_picture()
else:
if not self.update_after_id:
self.update_after_id = self.after(int(1000/self.maxupdate), self.load_picture)
def load_picture(self):
if self.photo:
if self.update_after_id:
self.update_after_id = None
if (self.winfo_width() > 1) and (self.winfo_height() > 1): # prevent updates before widget gets sized
self.image = ImageTk.PhotoImage(Resize_Image(self.photo, (
self.winfo_width()-int(self.cget("bd"))-1, self.winfo_height()-int(self.cget("bd"))-1)))
# here is where I added the constants ^^^
# but even using cget to get the border size I have had to add to this
# to prevent the resize loop, and when using other widget styles
#(raised etc) this problem persists
self.configure(image=self.image)
def set_picture(self, filename):
with open(filename, mode="rb") as file:
self.photo = Image.open(file)
self.photo.load() # load image into memory to allow resizing later without file access
self.load_picture()
if __name__ == "__main__":
test = Pict_Frame(bg="grey", bd=2, relief="raised",
maxupdate=2, # allows problem to be easily seen
picture="image.jpg")
test.pack(fill="both", expand=True)
test.master.mainloop()
когда я применяю другие стили, такие как более толстая граница (10 пикселей), возникает эта проблема изменения размера, показывающая, что константы действительно не решают проблему.
так есть ли какой-либо метод, чтобы получить только пространство внутри виджета, а не его запрошенный размер?