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

标签 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()

但是当我尝试用一​​种方法制作 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 中调用 mainloopmainloop 必须始终被调用一次,因此最典型的是它是程序中的最后一行代码,或者主函数中的最后一行代码。

制作 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/

相关文章:

python - FastCGI 在 stderr : "Primary script unknown" - nginx and silex 中发送

python - PyInstaller -- 从脚本添加数据

python - 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

python - Tcl 错误 : can't iconify: override-redirect flag is set

python - 在 Ubuntu 上的 Tkinter Python 中将突出显示的文本分配/存储为变量

python - (Un)多组复选按钮的全选复选按钮功能

python - View 在 Python 3 中不存在,但在 Python 2 中存在

Python3 导入错误 : No module named 'reinforcement_learning'

python - tkinter 圆形按钮有白色边框

python - Tkinter 按钮禁用不起作用