通过鼠标单击和拖动 (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
我正在设计一个用于在 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