Tkinter canvas 多次创建图像
Tkinter canvas create image multiple times
我在代码中使用此函数在 canvas:
上创建图像
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")
我的问题是,每次调用此函数时,旧图像都会被删除并创建一个新图像。
如何防止旧图像被删除?我想在 canvas.
上多次创建图像
Image.open()
每次都会重写图像。
首先创建一个列表,例如__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")
感谢 Martineau 对此的贡献。如果保持独立且不重复使用,ImageTk 变量似乎可以工作。否则,即使是新实例,它们也会保持相同的文件路径。我设法通过保留 ImageTk
的单独变量将多个不同的图像绘制到 canvas
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])
最后一行绘制了用户最近选取的图像
我在代码中使用此函数在 canvas:
上创建图像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")
我的问题是,每次调用此函数时,旧图像都会被删除并创建一个新图像。
如何防止旧图像被删除?我想在 canvas.
上多次创建图像Image.open()
每次都会重写图像。
首先创建一个列表,例如__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")
感谢 Martineau 对此的贡献。如果保持独立且不重复使用,ImageTk 变量似乎可以工作。否则,即使是新实例,它们也会保持相同的文件路径。我设法通过保留 ImageTk
的单独变量将多个不同的图像绘制到 canvas 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])
最后一行绘制了用户最近选取的图像