Thanks Michael,
looking at the text.tcl I saw that I need to bind() also the "B1-Enter" and
"B1-Leave"
since they are responsible for the AutoRepeat window scroll once you exit the
window.
In order not to lose the auto-scroll I've duplicated the functionality copying
from text.tcl and removing the selection auto repeat
like this
...
self.bind('<B1-Leave>', self.autoRepeat)
self.bind('<B1-Enter>', self.cancelRepeat)
...
def cancelRepeat(self, event=None):
if self._autoId:
self.after_cancel(self._autoId)
self._autoId = None
return "break"
def autoRepeat(self, event=None):
self._autoId = None
if not self.winfo_exists(): return "break"
if event is None:
x, y = self._autoPos
else: # Unfortunatelly the scroll is fixed from the first time
it exits
x, y = self._autoPos = event.x, event.y
# Something like this would be more dynamic, but it doesn't work
# x = self.winfo_pointerx() - self.winfo_rootx()
# y = self.winfo_pointery() - self.winfo_rooty()
if y > self.winfo_height():
self.yview(tk.SCROLL, 1+y-self.winfo_height(), "pixels")
elif y < 0:
self.yview(tk.SCROLL, -1+y, "pixels")
elif x > self.winfo_width():
self.xview(tk.SCROLL, 2, tk.UNITS)
elif x < 0:
self.xview(tk.SCROLL, -2, tk.UNITS)
else:
return "break"
self._autoId = self.after(50, self.autoRepeat)
return "break"
Vasilis
________________________________________
From: Tkinter-discuss
[[email protected]] on behalf of
Michael Lange [[email protected]]
Sent: Sunday, November 04, 2018 22:56
To: [email protected]
Subject: Re: [Tkinter-discuss] Text drag&drop
Hi,
On Sun, 4 Nov 2018 19:37:29 +0000
Vasilis Vlachoudis <[email protected]> wrote:
(...)
> #1. However I cannot get rid of the #1. I've tried to subclass the
> #DndHandler()
> especially the on_motion() method to delete the text anchor (dirty
> hack) after looking at the text.tcl as well deleting the selection and
> calling the CancelRepeat to avoid the auto-scrolling, but nothing
> worked ok. Is there a way to tell the Text() to stop the selection?
I think you could add something like this to DnDHandler.__init__() :
def _return_break(widget, event):
return 'break'
self._id = widget.bind('<B1-Motion>')
widget.bind('<B1-Motion>', _return_break)
which should remove the motion-selection binding and then restore it after
the dnd operation has finished by adding
self.initial_widget.bind('<B1-Motion>', self._id)
to the end of DnDHandler.finish() (untested however).
Regards
Michael
.-.. .. ...- . .-.. --- -. --. .- -. -.. .--. .-. --- ... .--. . .-.
"The combination of a number of things to make existence
worthwhile." "Yes, the philosophy of 'none,' meaning 'all.'"
-- Spock and Lincoln, "The Savage Curtain", stardate
5906.4
_______________________________________________
Tkinter-discuss mailing list
[email protected]
https://mail.python.org/mailman/listinfo/tkinter-discuss
_______________________________________________
Tkinter-discuss mailing list
[email protected]
https://mail.python.org/mailman/listinfo/tkinter-discuss