Как полностью закрасить кнопку, поверх изображения в tkinter?

Делаю MemoryPuzzle, но не могу придумать как мне закрасить кнопку, то есть я хочу, чтобы кнопка была допустим синей, а когда я на нее нажимаю, то этот цвет исчезает и я там вижу кнопку с изображением, которое должно там как бы быть

мой код:

from tkinter import *
from random import shuffle
from PIL import Image, ImageTk

class MemoGame:
    def __init__(self, window):
        self.CELLS_PER_ROW = 6
        self.window = window
        self.window.title('MemoPuzzle')
        self.characters = [{'image': 'images/1.png', 'id': 1},
                           {'image': 'images/2.png', 'id': 2}, 
                           {'image': 'images/3.png', 'id': 3}, 
                           {'image': 'images/4.png', 'id': 4}, 
                           {'image': 'images/5.png', 'id': 5}, 
                           {'image': 'images/6.png', 'id': 6}, 
                           {'image': 'images/7.png', 'id': 7}, 
                           {'image': 'images/8.png', 'id': 8}, 
                           {'image': 'images/9.png', 'id': 9}] * 2
        """
        в self.characters я использую id чтобы сразу получать айди 
        картинок проверять одинаковые они или нет и потом убирать и т.д. и т.п.
        """
        self.load_game()

    def shuffle_images(self):
        shuffle(self.characters)
        for num, i in enumerate(self.characters):
            image = ImageTk.PhotoImage(Image.open(i["image"]).resize((150, 200), Image.ANTIALIAS))
            btn = Button(self.window, 
                         bg="white", 
                         activebackground="white", 
                         image=image, relief=SUNKEN, 
                         borderwidth=0, bd=0, 
                         command=lambda j=i["id"]: print(j))
            btn.image = image
            btn.grid(row=(num // self.CELLS_PER_ROW), column=(num % self.CELLS_PER_ROW), sticky="W", padx=5, pady=5)

    def load_game(self):
        self.shuffle_images()

root = Tk()
memo = MemoGame(root)

root.mainloop()


Ответы (1 шт):

Автор решения: GrAnd

Как вариант, менять картинку у кнопок на какую-нибудь обложку.

from tkinter import *
from random import shuffle
from PIL import Image, ImageTk

class MemoGame:
    def __init__(self, window):
        self.CELLS_PER_ROW = 6
        self.window = window
        self.window.title('MemoPuzzle')
        self.characters = [{'file': 'images/1.png', 'id': 1},
                           {'file': 'images/2.png', 'id': 2}, 
                           {'file': 'images/3.png', 'id': 3}, 
                           {'file': 'images/4.png', 'id': 4}, 
                           {'file': 'images/5.png', 'id': 5}, 
                           {'file': 'images/6.png', 'id': 6}, 
                           {'file': 'images/7.png', 'id': 7}, 
                           {'file': 'images/8.png', 'id': 8}, 
                           {'file': 'images/9.png', 'id': 9}] * 2
        """
        в self.characters я использую id чтобы сразу получать айди 
        картинок проверять одинаковые они или нет и потом убирать и т.д. и т.п.
        """
        # preload images
        self.cover = ImageTk.PhotoImage(Image.open('images/cover.png').resize((150, 150), Image.ANTIALIAS))
        for char in self.characters:
            char['image'] = ImageTk.PhotoImage(Image.open(char["file"]).resize((150, 150), Image.ANTIALIAS))

        self.create_game_field()
        self.new_game()
    
    def close_tiles(self, tiles):
        for index in tiles:
            self.tiles[index].configure(image=self.cover)
        self.can_click = True
            
    def tile_clicked(self, index):
        if self.can_click and not self.tiles_opened[index]:
            print(index, self.characters[index]['id'])
            self.tiles[index].configure(image=self.characters[index]['image'])
            if self.tile_pair_index is None:  # opened first tile of pair
                self.tile_pair_index = index
            else:  # opened matched tile
                if self.characters[index]['id'] != self.characters[self.tile_pair_index]['id']:  # did not match
                    self.can_click = False
                    self.window.after(800, lambda tiles=[self.tile_pair_index, index]: self.close_tiles(tiles))
                else:  # matched
                    self.tiles_opened[index] = self.tiles_opened[self.tile_pair_index] = True
                    if all(self.tiles_opened):
                        print("Finished")
                        self.window.after(2000, self.new_game)
                self.tile_pair_index = None

    def create_game_field(self):
        self.tiles = []
        for num, char in enumerate(self.characters):
            btn = Button(self.window, 
                         bg="white", 
                         activebackground="white", 
                         relief=SUNKEN, 
                         borderwidth=0, bd=0, 
                         command=lambda num=num: self.tile_clicked(num))
            btn.grid(row=(num // self.CELLS_PER_ROW), column=(num % self.CELLS_PER_ROW), sticky="NEWS", padx=5, pady=5)
            self.tiles.append(btn)

    def new_game(self):
        self.can_click = False
        shuffle(self.characters)
        self.tiles_opened = [False]*len(self.characters)  # to save which tiles were opened already
        for tile, char in zip(self.tiles, self.characters):
            tile.configure(image=char['image'])
        self.window.after(3000, self.start_game)

    def start_game(self):
        for tile in self.tiles:
            tile.configure(image=self.cover)
        self.tile_pair_index = None
        self.can_click = True

root = Tk()
memo = MemoGame(root)

root.mainloop()

-

→ Ссылка