【问题标题】:Tkinter canvas refreshingTkinter 画布刷新
【发布时间】:2016-05-02 03:05:59
【问题描述】:

我正在创建一个框架并使用 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") 不起作用。

【问题讨论】:

  • 嗨,它对我有用。你能提供一个工作代码示例来解决你的问题吗?或者尝试在你的画布对象上使用update
  • 为什么你认为它不起作用?这是正确的语法。它只是_必须_工作。您正在创建一个图像项目,然后立即将其删除。你有什么证据表明它不起作用?

标签: python python-2.7 python-3.x tkinter tkinter-canvas


【解决方案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 小部件上有多个元素并且您只想删除您的图像,您可以将其 id 指定给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) 

演示

这就是你得到的:

点击按钮后,图片会被清空:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    相关资源
    最近更新 更多