我正在尝试将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 ...
答案 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()