Как полностью закрасить кнопку, поверх изображения в 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()
