为什么我的 canvas 图片会消失,即使我保留了参考?

Why does my canvas image disappear even though I keep a reference?

想法是让用户点击颜色栏,左侧的输入字段将为用户输入 0 到 100 之间的数字。问题是颜色条图像是空白的,即使我试图保留对它的引用以便它不会被垃圾收集。

import Tkinter as Tk

class Test(Tk.Frame):
    '''Test color bar for user input'''

    def __init__(self, parent):
        Tk.Frame.__init__(self, parent)

        photo_color_bar_01 = Tk.PhotoImage(file = 'color_bar_blue_to_red_020.GIF')
        pic_width = photo_color_bar_01.width()
        pic_height = photo_color_bar_01.height()
        shift_x_01 = 0 # 10
        shift_y_01 = 0 # 10
        pic_width_plus_border = pic_width + shift_x_01
        pic_height_plus_border = pic_height + shift_y_01
        x_center = (pic_width_plus_border) / 2.0
        y_center = (pic_height_plus_border) / 2.0

        My_Labels = ["Input_One", "Input_Two", "Input_Three", "Input_Four"]
        Labels = []
        variables = []
        entrys = []
        pic_frames = []
        canvases = []
        label_row = 0
        entry_row = 1
        for index in range(len(My_Labels)):

            Labels.append(Tk.Label(root, text=My_Labels[index]))
            Labels[-1].grid(padx=0, pady=0, row=label_row, column=0)

            variables.append(Tk.StringVar())
            entrys.append(Tk.Entry(root, textvariable =variables[index]))
            entrys[-1].grid(padx=0, pady=0, row=entry_row, column=0)
            entrys[-1].delete(0, Tk.END)
            entrys[-1].insert(0, "50.00")

            pic_frames.append(Tk.Frame(root, bd=4, relief=Tk.RAISED))
            pic_frames[-1].grid(padx=0, pady=0, row=entry_row, column=2)

            canvases.append(Tk.Canvas(pic_frames[-1], width=pic_width, height=pic_height))
            canvases[-1].create_image(x_center, y_center, image=photo_color_bar_01, anchor = Tk.CENTER)
            # keep a reference
            # http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm
            canvases[-1].image = photo_color_bar_01 # keep a reference
            canvases[-1].config(cursor="X_cursor")
            canvases[-1].grid(padx=0, pady=0, row=entry_row, column=3)
            canvases[-1].bind("<ButtonPress-1>", lambda event, arg=index: self.pick_LMB(event, index))
            canvases[-1].bind("<ButtonPress-2>", self.pick_MMB)

            label_row += 2
            entry_row += 2

    def pick_LMB(self, event, index):
        print "\nindex = " + str(index)
        canvas = event.widget
        x = canvas.canvasx(event.x)
        width_x = 180.0
        scaled_x = x/width_x * 100.0
        print "scaled_x = " + '{0:.2f}'.format(scaled_x)
        #entrys[index].delete(0, Tk.END)
        #entrys[index].insert(0, '{0:.2f}'.format(scaled_x))

    def pick_MMB(self, event):
        canvas = event.widget
        x = canvas.canvasx(event.x)
        print "\nx = " + str(x)
        width_x = 180.0
        scaled_x = x/width_x * 100.0
        print "scaled_x = " + '{0:.2f}'.format(scaled_x)

if __name__ == "__main__":
    root = Tk.Tk()
    Test(root)
    root.mainloop()

我忘记了.create_image命令,所以毕竟不是引用的问题。