我正在尝试显示 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()
但是当我尝试用一种方法制作 Canvas ,并用另一种方法显示 Canvas 时,它不会显示 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 来显示一些文本,所以我有兴趣在深入构建之前了解我出错的地方,以防它成为一个阻碍......
最佳答案
最明显的问题是,在第二种情况下,您永远不会调用 showImage
。即使您调用该函数后,您的图像也可能不会显示。如果没有对图像的引用,图像将被垃圾收集。看起来好像有一个引用,因为您将其添加到 Canvas 中,但这还不够。
您需要执行以下操作:
self.photo = ImageTk.PhotoImage(image)
最后,我建议您从 showImage
中调用 mainloop
。 mainloop
必须始终被调用一次,因此最典型的是它是程序中的最后一行代码,或者主函数中的最后一行代码。
制作 Tkinter 应用程序的更常见方法是子类化 Tk
对象或 Frame
对象,而不是让主应用程序成为通用对象。例如:
class MyApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
...
self.setupCanvas(...)
...
if __name__ == "__main__":
app = MyApp()
app.mainloop()
关于Python Tkinter - 将 jpg 显示为类方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13775175/