tkinter.TclError: изображение "pyimage" не существует с классом оболочки Button - PullRequest
0 голосов
/ 25 мая 2020

Общая проблема с 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 (), но я использую только один (да, я убедился).

Любые идеи очень приветствуются !

1 Ответ

0 голосов
/ 25 мая 2020

Благодаря подсказке stovfl в комментариях выше мне не хватало [0] в play():

Правильный код должен быть:

def play(self):
    self.image = self.current_sequence[self.frame_id][0]
    self.config(image=self.image)
    # More stuff below to loop through the frames etc.
...