Re: Text drag&drop

Vasilis Vlachoudis <[email protected]> Mon, 5 Nov 2018 07:39:33 +0000
Newsgroups gmane.comp.python.tkinter
Message-ID <[email protected]>
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