【问题标题】:Changing the colour of all canvas items (rectangles) pressed by a mouse click and drag (Tkinter)通过鼠标单击和拖动更改所有画布项目(矩形)的颜色(Tkinter)
【发布时间】:2016-07-07 01:32:39
【问题描述】:

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

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

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

一些研究使我找到了 canvas tag_bind 和 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

【问题讨论】:

  • 不熟悉 tkinter,但我在其他地方看到过跟踪 mouseup、mousedown 以及让对象跟随光标位置并使用画笔和对象之间的碰撞检测结束。

标签: python tkinter tkinter-canvas


【解决方案1】:

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

看起来像这样:

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

【讨论】:

  • 太棒了!这非常有效。在被困在这里一天之后,我现在可以继续了。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2017-05-03
  • 2015-08-11
  • 2013-06-01
  • 1970-01-01
  • 2017-06-29
  • 2016-01-20
相关资源
最近更新 更多