Размещение меток в холсте tkinter - PullRequest
0 голосов
/ 04 февраля 2019

Я делаю настольную игру с Tkinter.Доска представляет собой единую картинку.Я не знаю, как расположить пешки на этой картинке.

Я пытался положить доску и пешки на одно и то же полотно.Он работал с одной пешкой, но с несколькими пешками становился грязным.Пешки представлены квадратами с соответствующим цветом (т.е. синим).

def create_grid(self):
    self.grid_frame = Canvas(window)
    self.green_frame = Canvas(window)
    self.blue_frame = Canvas(window)
    self.grid_frame.grid(row=1, column=0)
    self.green_frame.grid(row=1, column=0)
    self.blue_frame.grid(row=1, column=0)
    self.grid_picture = PhotoImage(file="grid.PNG")
    self.grid_label = Label(self.grid_frame, image=self.grid_picture)
    self.grid_label.grid(row=0, column=0, columnspan=100, rowspan=10)
    self.green_picture = PhotoImage(file="green.png")
    self.green_symbol = Label(self.green_frame, image=self.green_picture)
    self.green_symbol.grid(row=9, column=2, columnspan=100, rowspan=10)
    self.blue_picture = PhotoImage(file="blue.png")
    self.blue_symbol = Label(self.blue_frame, image=self.blue_picture)
    self.blue_symbol.grid(row=9, column=7, columnspan=100, rowspan=10)

После использования функции выше, обе пешки, которые я пытался положить на игровое поле, приземляются посередине.И все же мне нужно разделить холст и разместить этикетку именно там, где я хочу.

Вот изображение полученного результата:

enter image description here

1 Ответ

0 голосов
/ 04 февраля 2019

Если ваша реализация не требует создания 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 просто расширяются до размера изображения пешки и остаются в центре.

...