【问题标题】:Change image on tkinter without button在没有按钮的情况下在 tkinter 上更改图像
【发布时间】:2021-09-20 22:37:47
【问题描述】:

谁能解释我如何正确使用主循环? 我正在尝试根据条件更新图像,问题是一切似乎都可以正常工作,但画布上的图像没有改变。

from tkinter import *

class Panel():
    def __init__(self, master):
        self.master=master
        self.frame1= Frame(master, width=500, height=500)
        self.frame1.pack()

        self.canvas1 = Canvas(self.frame1, width=1000, height=1000)
        self.canvas1.grid(row=0 , column=0)
        self.canvas1.pack()
        self.images=[]
        self.images.append(PhotoImage(file="download-icones-png-1.png"))
        self.images.append(PhotoImage(file="Download-Icon.png"))
        self.number = 0
        self.image_on_canvas = self.canvas1.create_image(0, 0, anchor = NW, image = self.images[self.number])
        #self.update_image()

    def update_image(self):
        if(self.number == 1):
            print("Current number is:",self.number)
            self.canvas1.itemconfig(self.image_on_canvas, image=self.images[self.number])
            self.number = 0
            print("The number change to:", self.number)
            self.canvas1.after(2000, self.update_image)
        elif(self.number==0):
            print("Current number is:",self.number)
            self.number = 1
            self.canvas1.itemconfig(self.image_on_canvas, image=self.images[self.number])
            print("The number change to:", self.number)
            self.canvas1.after(2000, self.update_image)


def Main():
     root = Tk()
     cp=Panel(root)
     cp.update_image()
     root.mainloop()

Main()

谢谢

解决方案:

self.canvas1.after(2000, self.update_image) 

必须在 if 语句之外

【问题讨论】:

  • 尝试取消注释 self.update_image() then 而不是在 if 语句中将 self.canvas1.after(2000, self.update_image) 放在函数的开头/结尾。
  • 我将 self.canvas1.after(2000, self.update_image) 放在函数之外并且正在工作。谢谢

标签: python user-interface tkinter


【解决方案1】:

嘿,出现这个问题是因为在将图像设置为标签后,它会收集一个垃圾值,这就是我们无法更改它的原因,但您可以通过这样做来完成您的工作:

#First in your command line type this -- pip install pillow
from PIL import Image, ImageTK
image= Image.open(image_path)
photo = ImageTk.PhotoImage(image)
""" 
Here instead of PhotoImage(file=PATH) use the above and 
then as you have done in your code just append it in the 
list . -- enjoy 
"""

【讨论】:

  • 这可能不是问题,因为该方法实际上没有收集任何东西,因为它使用实例属性,所以这解决不了任何问题?
  • 据我在做我的项目时说的。这个问题也发生在我身上,上面的代码解决了这个问题,经过一番搜索,我发现标签在网站中存储了一个垃圾值,比如 cookie
  • @Mr.Expert 首先,使用PILImageTk.PhotoImage. It looks like tkinter.PhotoImage` 就足够了。其次,图像存储在self.images 中,并且在Main 函数完成之前,该变量不会被垃圾收集。这发生在所有tkinter 窗口都关闭之后。此时,您应该希望对图像进行垃圾收集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多