簡體   English   中英

Tkinter 畫布多次創建圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM