Python Tkinter - 将jpg显示为不起作用的类方法

时间:2012-12-08 06:35:49

标签: python tkinter

我正在尝试将jpg图像显示为我正在构建的GUI项目的背景。

我可以用一种方法来实现它:

from Tkinter import *
from PIL import Image, ImageTk

class MakeGUI(object):
    master = None
    w = None

    def __init__(self):
        self.canvasSizeY = 400 #height
        self.canvasSizeX = 640 #width

    def setupCanvas(self):
        """
        preps the canvas for drawing.
        """
        self.master = Tk()
        self.w = Canvas(self.master, width=self.canvasSizeX, height=self.canvasSizeY)
        self.w.config(bg='white')
        image = Image.open("background.jpg")
        photo = ImageTk.PhotoImage(image)
        self.w.create_image(0,0, image=photo, anchor=NW)
        self.w.pack()
        mainloop()

def main():
    makeGUI = MakeGUI()
    makeGUI.setupCanvas()

if __name__ == '__main__':
    main()

但是当我尝试用一​​种方法制作画布,并在另一种方法中显示画布时,它没有显示jpg(当我进行测试时,我创建并显示了& text和矩形使用这个法):

from Tkinter import *
from PIL import Image, ImageTk

class MakeGUI(object):
    master = None
    w = None

    def __init__(self):
        self.canvasSizeY = 400 #height
        self.canvasSizeX = 640 #width

    def setupCanvas(self):
        """
        preps the canvas for drawing.
        """
        self.master = Tk()
        self.w = Canvas(self.master, width=self.canvasSizeX, height=self.canvasSizeY)
        self.w.config(bg='white')
        image = Image.open("background.jpg")
        photo = ImageTk.PhotoImage(image)
        self.w.create_image(0,0, image=photo, anchor=NW)

    def showImage(self):
        """
       pushes the image to the screen
       """
        self.w.pack()
        self.w.mainloop()

def main():
    makeGUI = MakeGUI()
    makeGUI.setupCanvas()

if __name__ == '__main__':
    main()

我想动态地使用GUI来显示一些文本,因为我正在进行一些编辑,所以我很有兴趣了解我之前遇到的错误,如果它是一个showstopper ...

1 个答案:

答案 0 :(得分:2)

最明显的问题是,在第二种情况下,你永远不会打电话给showImage。即使在您调用该功能后,您的图像也可能无法显示。如果没有对它们的引用,图像将被垃圾收集。它可能看起来像是一个引用,因为你将它添加到画布,但这还不够。

您需要执行以下操作:

self.photo = ImageTk.PhotoImage(image)

最后,我建议您从mainloop拨打showImage电话。 mainloop必须始终只调用一次,因此最常见的是它是程序中的最后一行代码,或者是main函数中的最后一行代码。

创建Tkinter应用程序的一种更常见的方法是子类化Tk对象或Frame对象,而不是让主应用程序成为通用对象。例如:

class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        ...
        self.setupCanvas(...)
        ...
if __name__ == "__main__":
    app = MyApp()
    app.mainloop()