TkInter 脚本与 class - Canvas 行为

TkInter script vs class - Canvas behaviour

我正在使用 TkInter 编写一个 GUI,它将包含一个图像和图像旁边面板中的几个按钮。

我首先编写了一个可以让我可视化图像的脚本,它工作得很好:

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import Tkinter
from PIL import Image, ImageTk

window = Tkinter.Tk()
window.title("Test GUI")
window.geometry("640x478")
window.configure(background='grey')

window.grid()

img = ImageTk.PhotoImage(Image.open('./test.jpg'))

canvas = Tkinter.Canvas(window, width=640, height=478, bg='white')
canvas.create_image(0,0,anchor='nw',image=img)

canvas.grid(column=0,row=0)

window.mainloop()

然后我尝试将上面的代码重写为class,以实现一些事件处理功能。但是,在class初始化函数中编写的完全相同的代码将不会显示图像。

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

import Tkinter
from PIL import Image, ImageTk

class showImageGUI(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):

        # the grid layout manager is a simple grid 
        # where you put your widgets
        self.grid()

        img = ImageTk.PhotoImage(Image.open('./test.jpg'))

        canvas = Tkinter.Canvas(self, width=640, height=478, bg='white')
        canvas.create_image(0,0,anchor='nw',image=img)

        canvas.grid(column=0,row=0)

if __name__ == "__main__":
    app = showImageGUI(None)
    app.title('Test GUI')
    # event-driven programming: the program will 
    # loop forever doing nothing but wait for events
    # and only react when it receives an event
    app.mainloop()

两者唯一的区别是:

Can someone please explain me why is this breaking the code / how to solve it?

Tkinter 中存在一个错误,即使没有外部引用它们也会导致图像消失,即使它们应该以某种方式绑定到 Canvas 小部件中。我可能没有很好地解释这一点,因为我从来没有费心去真正研究正在发生的事情。我相信它在 effbot.org.

的某处有解释

无论如何,换行

img = ImageTk.PhotoImage(Image.open('./test.jpg'))

img = self.img = ImageTk.PhotoImage(Image.open('./test.jpg'))

而且我认为它对您有用。它对我有用。