【发布时间】:2025-12-21 13:45:11
【问题描述】:
from tkinter import Tk, Canvas, Label, NSEW
class CanvasChecker(Canvas):
def __init__(self, parent, n_pixels_per_case=60):
self.checker = {(7, 0): 'o', (7, 2): 'o', (7, 4): 'o', (7, 6): 'o', (6, 1): 'o',
(6, 3): 'o', (6, 5): 'o', (6, 7): 'o', (5, 0): 'o', (5, 2): 'o', (5, 4): 'o',
(5, 6): 'o', (2, 1): 'x', (2, 3): 'x', (2, 5): 'x', (2, 7): 'x', (1, 0): 'x',
(1, 2): 'x', (1, 4): 'x', (1, 6): 'x', (0, 1): 'x', (0, 3): 'x', (0, 5): 'x',
(0, 7): 'x'}
self.n_pixels_per_case = n_pixels_per_case
width = 8 * n_pixels_per_case
height = 8 * n_pixels_per_case
super().__init__(parent, width=width, height=height)
self.bind('<Configure>', self.redimension)
def draw_cases(self):
for i in range(8):
for j in range(8):
beg_line = i * self.n_pixels_per_case
end_line = beg_line + self.n_pixels_per_case
beg_column = j * self.n_pixels_per_case
end_column = beg_column + self.n_pixels_per_case
if (i + j) % 2 == 0:
color = '#E88515'
color = '#DDDDFF'
self.create_rectangle(beg_column, beg_line, end_column, end_line, fill=color, tags='case')
def draw_pieces(self):
for position in self.checker:
coordinate_y = position[0] * self.n_pixels_per_case + self.n_pixels_per_case // 2
coordinate_x = position[1] * self.n_pixels_per_case + self.n_pixels_per_case // 2
piece = self.checker[position]
if piece == 'o':
icon = "\u26C0"
elif piece == 'O':
icon = "\u26C1"
elif piece == 'x':
icon = "\u26C2"
else:
icon = "\u26C3"
character_police = ('Already Seen', self.n_pixels_per_case//2)
self.create_text(coordinate_x, coordinate_y, text=icon, font=character_police, tags='piece')
def redimension(self, event):
new_size = min(event.width, event.height)
self.n_pixels_per_case = new_size // 8
self.actualise()
def actualise(self):
self.delete('case')
self.draw_cases()
self.delete('piece')
self.draw_pieces()
class Game(Tk):
def __init__(self):
super().__init__()
self.canvas_checker = CanvasChecker(self, 60)
self.canvas_checker.grid(sticky=NSEW)
self.messages = Label(self)
self.messages.grid()
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
if __name__ == '__main__':
window = Game()
window.mainloop()
我有一个棋盘。我会对在不同情况下拖放每个棋子感兴趣,但我很困惑如何做到这一点。我曾想过使用my_canvas.bind("<B1-Motion>", move),但我不确定如何在上面的代码中使用它。现在,我只能看到不同的白色和黑色块而不能移动它们。
如何在棋盘上拖放棋子?
【问题讨论】:
标签: python tkinter canvas bind