Общая проблема с Tkinter заключается в том, что для использования изображений в ярлыках и кнопках вам нужна ссылка на объект PhotoImage ... как-то. собственные функции, потому что я хочу использовать GIF-файлы вместо изображений, и я хочу иметь возможность переключаться между GIF-изображениями, когда я нажимаю кнопку (или использую горячую клавишу keyboard
). Первый GIF работает нормально и отлично зацикливается. Когда я переключаюсь на второй GIF, я получаю сообщение об ошибке: _tkinter.TclError: image "pyimage48
... pyimage55" doesn't exist
. Это выглядит следующим образом:
from tkinter import *
from PIL import ImageTk, Image
class AnimatedButton(Button)
def __init__(self, master, size, img_paths):
self.size = size
self.seq_count = len(img_paths) # Number of gif files
self.sequences = []
for path in img_paths:
gif, delay = loadGif(path)
# Create a tuple of all frames in a gif, with the delay between frames. Store this tuple in self.sequences
self.sequences.append(([ImageTk.PhotoImage(frame) for frame in gif], delay))
self.delay = self.sequences[0][1]
self.current_sequence = self.sequences[0][0]
self.image = self.current_sequence[0]
self.seq_id = 0 # Sequence counter
self.frame_id = 0 # Frame counter
Button.__init__(self, master, image=self.image, width=size, height=size)
self.cancel = self.after(self.delay, self.play)
def play(self):
self.image = self.current_sequence[self.frame_id]
self.config(image=self.image)
# More stuff below to loop through the frames etc.
Странно то, что у меня ничего этого нет с моим другим классом Button, MyButton
, также классом-оболочкой.
class MyButton(Button):
def __init__(self, master, size, img_paths):
self.image_count = len(img_paths)
self.image_id = 0
self.size = size
self.images = []
for path in img_paths:
try:
im = Image.open(path)
except:
print("Could not open file {}".format(path))
photo_image = ImageTk.PhotoImage(im, image_mode)
self.images.append(photo_image)
self.image = self.images[0]
Button.__init__(self, master, image=self.image, width=size,
height=size)
Большинство поисковых запросов в Google указывают на то, что вам не следует использовать два вызова tkinter.Tk (), но я использую только один (да, я убедился).
Любые идеи очень приветствуются !