通过鼠标单击并拖动(Tkinter)更改所有画布项目(矩形)的颜色

时间:2016-07-07 01:32:39

标签: python tkinter tkinter-canvas

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

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

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

一些研究引导我使用canvas tag_bind和bind,但这些似乎都不能让我实现我想要的拖动功能。 event.widget.findclosest方法非常不准确。

这是我必须绘制网格而无需访问onclick函数的代码。

export function fetchVehicle(id) {
    return dispatch => {
        return dispatch({
            type: 'FETCH_VEHICLE',
            payload: fetch(`http://swapi.co/api/vehicles/${id}/`)
                .then(status)
                .then(res => res.json())    
                .catch(error => {
                    return Promise.reject()
                })
            });
    };
}


function status(res) {
    if (!res.ok) {
        throw new Error(res.statusText);
    }
    return res;
}

1 个答案:

答案 0 :(得分:0)

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

它看起来像这样:

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