2017-02-14 32 views
0

Идея состоит в том, чтобы пользователь нажимал на панель цветов, а поле ввода слева получало число от 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() 

ответ

0

Я забыл .create_image команду, так что это не проблема, со ссылкой после того, как все.