Кнопка Tkinter не отображает изображение, несмотря на существующую ссылку - PullRequest
0 голосов
/ 25 марта 2020

В шахматной игре на основе GUI, которую я создал с помощью tkinter в Python, я использую изображения для отображения шахматной фигуры на кнопке сетки. Файлы изображений .png находятся в папке в том же каталоге, что и программа. Когда я запускаю код, изображения не отображаются на кнопке. Я нашел этот вопрос , который говорит, что мне нужно сохранить ссылку на переменную. Мой код сохраняет ссылку и, несмотря на это, изображение не отображается. (Имейте в виду, что на данный момент изображение будет отображаться только для черных пешек)

Вот код, который создает кнопку (Python 3.7):

class Space(tk.Button):
color = 0
inst_num = 0

def __init__(self, name, root, player=None):
    Space.inst_num += 1
    Space.color += 1
    Space.color += (1 if Space.color % 9 == 0 else 0)

    self.root = root
    self.name = name
    self.player = player

    super().__init__(self.root, image=P_ABBREVIATIONS[self.name], bg=('grey' if Space.color % 2 == 0 else 'white'),
                     fg=('black' if player == 'B' else 'grey22'), height=80, width=80, relief='flat')

А вот код, в котором хранится объект PhotoImage:

if __name__ == '__main__':
    master = tk.Tk()

P_ABBREVIATIONS = {'Pawn': tk.PhotoImage(r'icons\b_pawn.png').subsample(8, 8)}      # For now only Pawn TODO: add other chess peice PhotoImage objects 

if __name__ == '__main__':
    Chess = ChessBoard(master)
    master.mainloop()

Для всего кода go до: https://pastebin.com/JXxBsLCz

1 Ответ

0 голосов
/ 25 марта 2020

Проблема в том, что вы создаете изображение неправильно. Путь должен быть присвоен опции file. Первый позиционный аргумент присваивается как внутреннее имя изображения. Таким образом, если вы опустите file=, вы назначаете имя, но не предоставляете изображению никаких данных.

tk.PhotoImage(file=r'icons\b_pawn.png')
              ^^^^^
...