Обновление холста Tkinter

Я создаю рамку и показываю изображение в рамке, используя холст в Tkinter. Но мне нужно непрерывно показывать изображения одно за другим в цикле. Но не удалось обновить холст. Ниже мой код.

cwgt=Canvas(self.parent.Frame1)
cwgt.pack(expand=True, fill=BOTH)
image1 = Image.open(image1)
image1 = ImageTk.PhotoImage(image1)
cwgt.img=image1
cwgt.create_image(0, 0, anchor=NW, image=image1)
cwgt.delete("all")

cwgt.delete("all") не работает.


person das    schedule 02.05.2016    source источник
comment
Привет, это работает для меня. Можете ли вы предоставить пример рабочего кода с вашей проблемой? Или попробуйте использовать update на своем объекте холста.   -  person VRage    schedule 02.05.2016
comment
Как вы думаете, почему это не работает? Это правильный синтаксис. Это просто_должно_ работать. Вы создаете элемент изображения, а затем сразу же удаляете его. Какие у вас есть доказательства того, что это не работает?   -  person Bryan Oakley    schedule 02.05.2016


Ответы (1)


cwgt.delete(all) не работает.

Ну, не только эта строка не работает, но и все остальное не работает, поэтому я покажу вам здесь минимальный рабочий пример, основанный на вашем тексте (не на вашем коде), чтобы объяснить вам, как этого добиться.

Метод delete() выполняет то, что вы хотите сделать. Вы можете передать ему строку all в качестве аргумента, чтобы удалить все элементы, присутствующие в вашем виджете Tkinter.Canvas, или указать ссылку на элемент, который вы хотите удалить.

Полная программа

'''
Created on May 2, 2016

@author: Billal Begueradj
'''
import Tkinter as Tk
from PIL import Image, ImageTk

class Begueradj(Tk.Frame):
    '''
    Dislay an image on Tkinter.Canvas and delete it on button click
    '''
    def __init__(self, parent):
        '''
        Inititialize the GUI with a button and a Canvas objects
        '''
        Tk.Frame.__init__(self, parent)
        self.parent=parent
        self.initialize_user_interface()
   
    def initialize_user_interface(self):
        """
        Draw the GUI
        """
        self.parent.title("Billal BEGUERADJ: Image deletion")       
        self.parent.grid_rowconfigure(0,weight=1)
        self.parent.grid_columnconfigure(0,weight=1)
        self.parent.config(background="lavender")    
        
        # Create a button and append it  a callback method to clear the image          
        self.deleteb = Tk.Button(self.parent, text = 'Delete', command = self.delete_image)
        self.deleteb.grid(row = 0, column = 0)
        
        self.canvas = Tk.Canvas(self.parent, width = 265, height = 200)  
        self.canvas.grid(row = 1, column = 0)   
           
        # Read an image from my Desktop
        self.image = Image.open("/home/hacker/Desktop/homer.jpg")
        self.photo = ImageTk.PhotoImage(self.image)        
        # Create the image on the Canvas     
        self.canvas.create_image(132,100, image = self.photo)
        
    def delete_image(self):
        '''
        Callback method to delete image
        '''
        self.canvas.delete("all")  
        

# Main method
def main():
    root=Tk.Tk()
    d=Begueradj(root)
    root.mainloop()

# Main program       
if __name__=="__main__":
    main()

Если у вас есть более одного элемента в виджете Tkinter.Canvas и вы хотите удалить только свое изображение, вы можете указать его идентификатор в методе delete(), потому что Tkinter.Canvas.create_image() возвращает id созданного изображения (хотя это не упоминается в документации, на которую я ссылаюсь).

Это означает, что в приведенном выше коде вы можете запустить:

self.ref_id = self.canvas.create_image(132,100, image = self.photo)

и внутри метода delete_image():

self.canvas.delete(self.ref_id) 

Демо

Это то, что ты получаешь:

введите здесь описание изображения

После нажатия на кнопку изображение будет очищено:

введите здесь описание изображения

person Billal Begueradj    schedule 02.05.2016