Tkinter canvas drag/drop obstacle
Simon Forman
sajmikins at gmail.com
Mon Jun 23 00:53:28 EDT 2008
On Jun 22, 7:41 pm, Peter Pearson <ppear... at nowhere.invalid> wrote:
> On Fri, 20 Jun 2008 13:41:35 -0300, Guilherme Polo <ggp... at gmail.com> wrote:
> > On Fri, Jun 20, 2008 at 1:11 PM, Peter Pearson <ppear... at nowhere.invalid> wrote:
> >> Tkinter makes it very easy to drag jpeg images around on a
> >> canvas, but I would like to have a "target" change color when
> >> the cursor dragging an image passes over it. I seem to be
> >> blocked by the fact that the callbacks that might tell the
> >> target that the mouse has entered it (<Enter>, <Any-Enter>,
> >> even <Motion>) aren't called if the mouse's button is down.
> >> What am I missing? Have I failed to find the right Tkinter
> >> document? Is Tkinter the wrong tool for this job? Thanks.
>
> > I believe the only way to achieve this is binding <Motion> to the
> > entire canvas, then checking if the x, y coords are inside the
> > "target".
>
> Ugh. OK, thanks.
>
> --
> To email me, substitute nowhere->spamcop, invalid->net.
Yep, but it's not so bad:
from Tkinter import *
c = Canvas()
c.pack()
i = c.create_oval(1, 1, 100, 100, fill='green')
def cb(e):
items = c.find_overlapping(
e.x, e.y,
e.x + 1, e.y + 1
)
if not items:
return
print items
c.bind("<B1-Motion>", cb)
mainloop()
The c.find_overlapping() method returns a tuple. I believe the item
ids in the tuple (if any) will be in the same order as the items Z
order on the canvas, so "items[-1]" should always be the "topmost"
graphic item (again, if any.)
More information about the Python-list
mailing list