为什么即使我保留参考,我的画布图像也会消失?

时间:2017-02-14 01:36:27

标签: python image canvas mouse bind

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

color_bar_blue_to_red_020.GIF

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

1 个答案:

答案 0 :(得分:0)

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