在 tkinter 中定位标签 canvas
Positioning labels within tkinter canvas
我正在用 Tkinter 制作棋盘游戏。董事会是一张图片。我不知道怎么把棋子放在那张图片上。
我试着把棋盘和棋子放在同一个 canvas 上。它适用于单个 pawn,但使用多个 pawn 会变得混乱。棋子由具有匹配颜色(即蓝色)的方块表示。
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)
使用上面的功能后,我试图放在棋盘上的两个棋子都落在了中间。但是我需要划分 canvas 并将标签精确地放置在我想要的位置。
这是我得到的结果图片:
如果您的实施不需要创建标签,我建议绘制和删除 canvas 对象。 Canvas class 有简单的方法如 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()
在实施时,您应该检查网格管理器的工作原理。我已经对其进行了测试,代码完全按照您的要求执行。例如,如果没有其他更小的列和行,则指定 row=9 和 column=5 不会将 Label 放置在第 9 行和第 5 列。无论如何,在您的代码中,您为不同颜色的棋子创建了两个 canvas 对象。然后将所有 canvas 个对象放在网格的同一个单元格中。这将创建一个大 canvas 的棋盘图片和两个位于中心的小 canvas 对象。当您将一个 pawn 放入其中时,canvas 个对象只会扩展到 pawn 图像的大小并停留在中心。
我正在用 Tkinter 制作棋盘游戏。董事会是一张图片。我不知道怎么把棋子放在那张图片上。
我试着把棋盘和棋子放在同一个 canvas 上。它适用于单个 pawn,但使用多个 pawn 会变得混乱。棋子由具有匹配颜色(即蓝色)的方块表示。
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)
使用上面的功能后,我试图放在棋盘上的两个棋子都落在了中间。但是我需要划分 canvas 并将标签精确地放置在我想要的位置。
这是我得到的结果图片:
如果您的实施不需要创建标签,我建议绘制和删除 canvas 对象。 Canvas class 有简单的方法如 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()
在实施时,您应该检查网格管理器的工作原理。我已经对其进行了测试,代码完全按照您的要求执行。例如,如果没有其他更小的列和行,则指定 row=9 和 column=5 不会将 Label 放置在第 9 行和第 5 列。无论如何,在您的代码中,您为不同颜色的棋子创建了两个 canvas 对象。然后将所有 canvas 个对象放在网格的同一个单元格中。这将创建一个大 canvas 的棋盘图片和两个位于中心的小 canvas 对象。当您将一个 pawn 放入其中时,canvas 个对象只会扩展到 pawn 图像的大小并停留在中心。