2

I'm making a basic IDE, line numbers are going to be similar to IDLE, but I don't want to bind each possible key to an event which changes the box with the current line/col in it. Is there some kind of "on change", or "one cursor move" event build into Tkinter, or more specifically, ScrolledText. If there isn't then if anyone can point me in the right direction that would be fantastic.

Thanks!

ahansen
  • 234
  • 4
  • 15

1 Answers1

5

There's nothing built-in per se, but what you want to do is possible if you're willing to be creative.

At it's core a text widget is a tcl command, and this command is called whenever something happens to the text widget: text is inserted, deleted, the cursor changes, etc. The nature of tcl is that we can replace this command with our own command. And since we can do that, we can detect certain changes, and call our own function before or after.

It sounds complicated, and it is. On a positive note, it's foolproof once you have it working, and it means you don't have to do any custom bindings. To see a complete working example, see this answer to the question binding to cursor movement doesnt change INSERT mark.

The scrolled text widget is just a thin wrapper around a regular text widget, so this answer will work with just a tiny bit of tweaking (you'll need the reference to the text widget used by the scrolledtext widget). The wrapper is so thin, however, that I recommend not using it since adding scrollbars to a text widget is trivial.

Community
  • 1
  • 1
Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685