[英]Tkinter canvas create image multiple times
我在代碼中使用此函數在畫布上創建圖像:
def _create_image(self, coord):
(x,y) = coord
self.one = ImageTk.PhotoImage(Image.open("test.jpg"))
root.one = self.one
self.canvas.create_image(x-25, y-25, image=self.one, anchor='nw', tags="image")
我的問題是,每次我調用此函數時,都會刪除舊圖像並創建新圖像。
如何防止舊圖像被刪除? 我想在畫布上多次創建圖像。
首先在例如__init__()
創建一個列表。
self.img_ref = []
然后在創建它們時將每個新圖像附加到此列表中:
def _create_image(self, coord):
(x,y) = coord
self.one = ImageTk.PhotoImage(Image.open("test.jpg"))
root.one = self.one
self.canvas.create_image(x-25, y-25, image=self.one,
anchor='nw', tags="image")
self.img_ref.append(self.one) # Keep reference to image
即使每個圖像都是相同的圖像,您也必須保留對每個圖像的引用。
你並不需要修改__init__()
方法,也沒有存儲引用列表,因為它總是相同的圖像文件。 這里避免使用不必要的資源,因此會使用更少的內存(並且可能更快)。
它通過測試one
屬性是否已經存在來實現這一點,如果不存在,則僅讀取圖像數據並在第一次創建PImageTk.PhotoImagehotoImage
。
這種方法允許您從同一個ImageTk.PhotoImage
創建多個Canvas
小部件圖像對象,而不是將它的多個副本加載到內存中。
def _create_image(self, coord):
(x,y) = coord
if not getattr(self, 'one', None): # First call?
pil_img = Image.open("test.jpg")
self.one = ImageTk.PhotoImage(pil_img)
self.canvas.create_image(x-25, y-25, image=self.one,
anchor='nw', tags="image")
您還可以在一行中創建ImageTk.PhotoImage
:
# pil_img = Image.open("test.jpg") # Leave out.
self.one = ImageTk.PhotoImage(file="test.jpg")
Image.open()
每次都會重寫圖像。
感謝 Martineau 對這一問題的投入。 ImageTk 變量如果保持獨立且不重復使用,則似乎可以工作。 否則,即使是新實例,它們也會保持相同的文件路徑。 我設法通過保留 ImageTk 的單獨變量將多個不同的圖像繪制到畫布上
from PIL import Image, ImageTk
import tkinter as tk
from tkinter.filedialog import askopenfilename
root = tk.Tk
root.mainloop()
self.ph = [] #keep photoimage instances separate
def appendImages(self): #Call appendImages as many times as needed
path = askopenfilename(initialdir="/", title="Select file", filetypes(("all files", "*.*"),("jpeg files", ".jpg")))
im = Image.open(path)
self.ph.append(ImageTk.PhotoImage(im))
self.canvasImage=self.canvas.create_image(x,y,anchor=NW,image=self.ph[len(self.ph)-1])
最后一行繪制用戶選擇的最新圖像
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.