1

我正在尝试将 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(当我一直在测试时,我已经使用这种方法创建并显示了文本和矩形):

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 来显示一些文本,所以我有兴趣在我深入构建之前了解我做错了什么,以防它成为一个阻碍......

4

1 回答 1

2

最明显的问题是,在第二种情况下,您永远不会调用showImage. 即使您确实调用了该函数,您的图像也可能不会出现。如果没有对它们的引用,图像将被垃圾收集。似乎有一个参考,因为您将它添加到画布,但这还不够。

您需要执行以下操作:

self.photo = ImageTk.PhotoImage(image)

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

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

class MyApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        ...
        self.setupCanvas(...)
        ...
if __name__ == "__main__":
    app = MyApp()
    app.mainloop()
于 2012-12-08T13:47:22.230 回答