通过鼠标单击和拖动 (Tkinter) 更改所有 canvas 个项目(矩形)的颜色

Changing the colour of all canvas items (rectangles) pressed by a mouse click and drag (Tkinter)

我正在设计一个用于在 Python 中创建像素艺术的应用程序。我目前拥有它,以便用户可以指定所需的网格大小(宽度 * 高度),它将创建一个指定高度的网格,每个网格正方形代表二维列表中的一个点。

我使用 Tkinter 的 canvas 小部件和它的 create_rectangle 方法来绘制网格,如代码摘录所示。

我希望能够单击一个网格方块并拖动我的鼠标,使原来单击的网格方块和所有被鼠标拖过的网格方块都改变颜色。

我进行了一些研究 canvas tag_bind 和绑定,但这些似乎都无法实现我想要的拖动功能。 event.widget.findclosest 方法非常不准确。

这是我必须在不访问 onclick 函数的情况下绘制网格的代码。

 def drawGrid(self):
    for x in range(0, self.grid_width):
        for y in range(0, self.grid_height):
            x1 = (x * self.pixel_width)
            x2 = (x1 + self.pixel_width)
            y1 = (y * self.pixel_height)
            y2 = (y1 + self.pixel_height)
            self.grid[x,y] = self.canvas.create_rectangle(x1,y1,x2,y2)
    self.canvas.update()

def rectangleOnClick(event):
    #Colour the clicked square and all other squares that fall under mouse drag

您可以创建在按下按钮时设置标志并在释放按钮时释放标志的绑定。您可以设置鼠标移动的绑定,以便在设置标志时为光标下的项目着色。

看起来像这样:

class Example(object):
    def __init__(self, parent):
        ...
        self._dragging = False
        ...
        self.canvas.bind("<ButtonPress-1>", self.on_click)
        self.canvas.bind("<B1-Motion>", self.on_move)
        self.canvas.bind("<ButtonRelease-1>", self.on_release)

    def on_click(self, event):
        self._dragging = True
        self.on_move(event)

    def on_move(self, event):
        if self._dragging:
            items = self.canvas.find_closest(event.x, event.y)
            if items:
                rect_id = items[0]
                self.canvas.itemconfigure(rect_id, fill="red")

    def on_release(self, event):
        self._dragging = False