Изменение изображения на экране без кнопки

#python #user-interface #tkinter

Вопрос:

Кто-нибудь может объяснить мне, как правильно использовать mainloop? Я пытаюсь обновить изображение в зависимости от состояния,проблема в том, что все, кажется, работает, но изображение на холсте не меняется.

 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

Комментарии:

1. Попробуйте раскомментировать функцию self.update_image() then вместо self.canvas1.after(2000, self.update_image) того, чтобы помещать ее внутри операторов if в начало/конец функции.

2. Я поместил self.canvas1.after(2000, self.update_image) вне функции и работает. Спасибо

Ответ №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 
"""
 

Комментарии:

1. вероятно, это не проблема, так как на самом деле в методе ничего не собирается, поскольку он использует атрибуты экземпляра, так что это ничего не решает?

2. По моим словам, когда я работал над своим проектом . Эта проблема также возникла со мной, и приведенный выше код решил проблему, и после небольшого поиска я обнаружил, что ярлык хранит мусорное значение, такое как файлы cookie на веб-сайтах

3. @Г-н эксперт Во-первых, нет смысла использовать PILImageTk.PhotoImage. It looks like tkinter. Достаточно фотоизображения». Во-вторых, изображения хранятся внутри self.images , и эта переменная не собирает мусор до тех пор, пока Main функция не будет выполнена. Это происходит после того, как все tkinter окна закрыты. В этот момент вы должны захотеть, чтобы изображения были собраны в мусор.