I have a text widget with a scrollbar which looks something like this:
self.myWidget = Text(root)
self.myWidget.configure(state=DISABLED)
self.myWidget.pack()
self.myWidgetScrollbar = Scrollbar(root, command=self.myWidget.yview)
self.myWidget.configure(yscrollcommand=self.myWidgetScrollbar.set)
self.myWidgetScrollbar.pack(side=LEFT,fill=Y)
The text widget is updated 4 times per second with:
self.myWidget.configure(state=NORMAL)
self.myWidget.delete(1.0, END)
self.myWidget.insert(END, "\n".join(self.listWithStuff))
self.myWidget.configure(state=DISABLED)
The problem is that when I try to scroll, it keeps scrolling me back up to the top (4 times per second, probably). I assume this is because all content is removed.
How can I prevent it from scrolling automatically, or possibly scroll "back" when the content has changed?
You can jump to the bottom of the widget after each update using the yview method of the Text widget. Also, to prevent frustrating users by jumping when they are trying to scroll, you can do a simple check to make sure the scrollbar is already at the bottom (a.k.a the user isn't scrolling).
You can safe the position and set it back after an update, like this Tcl code does:
The Tkinter code would look similar, something like:
Not sure why the get() in between is needed, maybe to force some lookup, but it works.