#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
окна закрыты. В этот момент вы должны захотеть, чтобы изображения были собраны в мусор.