Если ваша реализация не требует создания Labels, я бы предложил нарисовать и удалить объекты canvas.У класса Canvas есть простые методы, такие как create_text()
или create_image()
.Вот пример такой реализации (я использовал текст, но вы легко можете изменить его на изображения, используя вышеупомянутый метод my_canvas.create_image()
):
import tkinter as tk
# PARAMETERS
SIZE = 800
SQUARES = 10
def draw_board():
i = 0
while i < SIZE:
canvas.create_line(0, i, SIZE, i)
canvas.create_line(i, 0, i, SIZE)
i += SIZE / SQUARES
def place_pawn(x, y, color):
pos = [(x-0.5)*SIZE/SQUARES, (y-0.5)*SIZE/SQUARES]
pawn_colors = {'blue': '#104E8B', 'green': '#008B45'}
canvas.create_text(pos, text='P', font=('Times', 30), fill=pawn_colors[color])
root = tk.Tk()
root.minsize(SIZE, SIZE)
canvas = tk.Canvas(root, width=SIZE, height=SIZE)
canvas.pack()
draw_board()
place_pawn(2, 3, 'blue')
place_pawn(8, 6, 'blue')
place_pawn(1, 1, 'blue')
place_pawn(9, 9, 'green')
place_pawn(9, 1, 'green')
root.mainloop()
Начиная с вашей реализации, вы должны проверитькак работает менеджер сетки.Я проверил это, и код делает именно то, что вы просили сделать.Например, указание строки = 9 и столбца = 5 не будет размещать метку в 9-й строке и 5-м столбце, если нет других меньших столбцов и строк.В любом случае, в вашем коде вы создаете два объекта canvas для пешек разного цвета.Затем вы помещаете все объекты холста в одну ячейку сетки.Это создает один большой холст с изображением на доске и двумя небольшими объектами холста в центре.Когда вы помещаете пешку внутрь, объекты Canvas просто расширяются до размера изображения пешки и остаются в центре.