画布上的Tkinter图像会导致错误消息

时间:2015-09-26 00:23:19

标签: python image canvas tkinter

我已阅读有关如何保存图片的所有帖子,因此不会收集垃圾。所以在下面的代码中我通过添加self.mapimage.image = self.map来完成。这有效,但我收到此回调错误: AttributeError:'int'对象没有属性'image'。该错误后程序继续工作。我们将非常感谢世界各地Tkinter专家提供的任何帮助。

类OpenClose:

def __init__(self, pullcat, pullitem):

    self.pullcat = pullcat
    self.pullitem = pullitem

def openfile(self):
    if self.pullitem == 'Watershed':
        self.watfile = filedialog.askopenfilename(filetypes = (("Watershed Files", "*.wshed"), ("All files", "*.*")))
    elif self.pullitem == 'Devices':
        self.devfile = filedialog.askopenfilename(filetypes = (("Devices", "*.dev"), ("All files", "*.*")))
    elif self.pullitem == 'ModelSettings':
        self.setfile = filedialog.askopenfilename(filetypes = (("Settings", "*.set"), ("All files", "*.*")))
    elif self.pullitem == 'Map':
        self.mapfile = filedialog.askopenfilename(filetypes = (("Map", "*.gif"), ("All files", "*.*")))
        self.map = PhotoImage(file = self.mapfile)
        self.mapimage = guiset.getcanob().create_image(640,480, image = self.map)
        self.mapimage.image = self.map

1 个答案:

答案 0 :(得分:1)

create_image返回一个int,用作画布图像的标识符。您需要对图像的不同引用。这条线

self.map = PhotoImage(file = self.mapfile)

就足够了。它为您提供了对图像的永久引用,因此不会被垃圾收集。只需删除

行即可
self.mapimage.image = self.map

你应该没问题。 (如果您只有map而不是self.map,那么当openfile完成时,这将是一个超出范围的局部变量,并且您的图像将被垃圾收集。但是因为{{1你是self.map的一个属性,在对象被销毁之前你会得到一个图像的引用。)